web-dev-qa-db-fra.com

Supprimer tous les éléments de RecyclerView

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

39
user2456977

Cela fonctionne très bien pour moi:

public void clear() {
    int size = data.size();
    if (size > 0) {
        for (int i = 0; i < size; i++) {
            data.remove(0);
        }

        notifyItemRangeRemoved(0, size);
    }
}

Source: https://github.com/mikepenz/LollipopShowcase/blob/master/app/src/main/Java/com/ mikepenz/lollipopshowcase/adaptateur/ApplicationAdapter.Java

ou:

public void clear() {
    int size = data.size();
    data.clear();
    notifyItemRangeRemoved(0, size);
}

Pour vous:

@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();
}
57
Jared Burrows

É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.
}
57
Bojan Kseneman
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();
}
15
Saif Ahmad

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();
3
Hau Le

Aidez-vous:

public void clearAdapter() {
    arrayNull.clear();
    notifyDataSetChanged();
}
3
Hadi Note

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().

0
Morgan Koh
private void clearRecyclerView() {
    CustomListViewValuesArr.clear();
    customRecyclerViewAdapter.notifyDataSetChanged();
}

utiliser cette fonction

0
Ebrahim Karimi

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
0
Nien Nguyen

Pour mon cas, l'ajout d'une liste vide a fait le travail.

List<Object> data = new ArrayList<>();
adapter.setData(data);
adapter.notifyDataSetChanged();
0
Themelis

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.

0
tryp