J'essaie de supprimer tous les éléments de ma RecyclerView
dans ma méthode onRestart
afin que les éléments ne soient pas chargés deux fois:
@Override
protected void onRestart() {
super.onRestart();
// first clear the recycler view so items are not populated twice
for (int i = 0; i < recyclerAdapter.getSize(); i++) {
recyclerAdapter.delete(i);
}
// then reload the data
PostCall doPostCall = new PostCall(); // my AsyncTask...
doPostCall.execute();
}
Mais pour une raison quelconque, la méthode delete
que j’ai créée dans adapter
ne fonctionne pas correctement:
dans RecyclerAdapter.Java:
public void delete(int position){
myList.remove(position);
notifyItemRemoved(position);
}
public int getSize(){
return myList.size();
}
Je pense que tous les autres éléments de ma liste sont supprimés au lieu de la totalité de la liste.
Avec un listview
c'était si facile et j’ai simplement appelé adapter.clear()
.
Quelqu'un peut-il s'il vous plaît m'aider à corriger le code?
Je pense que je devrais utiliser notifyItemRangeRemoved(...,...);
mais je ne sais pas comment. TIA
public void clear() {
int size = data.size();
if (size > 0) {
for (int i = 0; i < size; i++) {
data.remove(0);
}
notifyItemRangeRemoved(0, size);
}
}
public void clear() {
int size = data.size();
data.clear();
notifyItemRangeRemoved(0, size);
}
@Override
protected void onRestart() {
super.onRestart();
// first clear the recycler view so items are not populated twice
recyclerAdapter.clear();
// then reload the data
PostCall doPostCall = new PostCall(); // my AsyncTask...
doPostCall.execute();
}
Évitez de supprimer vos éléments dans une boucle for et d'appeler notifyDataSetChanged à chaque itération. Au lieu de cela, appelez simplement la méthode clear dans votre liste myList.clear();
puis informez votre adaptateur
public void clearData() {
myList.clear(); // clear list
mAdapter.notifyDataSetChanged(); // let your adapter know about the changes and reload view.
}
setAdapter(null);
Utile si RecycleView a différents types de vues
recyclerView.removeAllViewsInLayout();
La ligne ci-dessus vous aiderait à supprimer toutes les vues de la mise en page.
Pour vous:
@Override
protected void onRestart() {
super.onRestart();
recyclerView.removeAllViewsInLayout(); //removes all the views
//then reload the data
PostCall doPostCall = new PostCall(); //my AsyncTask...
doPostCall.execute();
}
Voici comment j'ai effacé ma vue de recyclage et y ai ajouté de nouveaux éléments avec animation:
mList.clear();
mAdapter.notifyDataSetChanged();
mSwipeRefreshLayout.setRefreshing(false);
//reset adapter with empty array list (it did the trick animation)
mAdapter = new MyAdapter(context, mList);
recyclerView.setAdapter(mAdapter);
mList.addAll(newList);
mAdapter.notifyDataSetChanged();
Aidez-vous:
public void clearAdapter() {
arrayNull.clear();
notifyDataSetChanged();
}
ListView
utilise clear()
.
Mais si vous ne le faites que pour RecyclerView
. Vous devez d’abord effacer votre RecyclerView.Adapter
Avec notifyItemRangeRemoved(0,size)
Ensuite, vous seul recyclerView.removeAllViewsInLayout()
.
private void clearRecyclerView() {
CustomListViewValuesArr.clear();
customRecyclerViewAdapter.notifyDataSetChanged();
}
utiliser cette fonction
Sur Xamarin.Android, ça marche pour moi et il faut changer de disposition
var layout = recyclerView.GetLayoutManager() as GridLayoutManager;
layout.SpanCount = GetItemPerRow(Context);
recyclerView.SetAdapter(null);
recyclerView.SetAdapter(adapter); //reset
Pour mon cas, l'ajout d'une liste vide a fait le travail.
List<Object> data = new ArrayList<>();
adapter.setData(data);
adapter.notifyDataSetChanged();
Un autre moyen d'effacer les éléments recyclerview consiste à instancier un nouvel adaptateur vide.
mRecyclerView.setAdapter(new MyAdapter(this, new ArrayList<MyDataSet>()));
Ce n'est probablement pas la solution la plus optimisée, mais cela fonctionne à merveille.