web-dev-qa-db-ja.com

RecyclerViewからすべてのアイテムを削除します

RecyclerViewメソッドのonRestartからすべての要素を削除しようとしているので、アイテムが2回ロードされません。

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

しかし、何らかの理由で、deleteで作成したadapterメソッドが正しく機能していません。

recyclerAdapter.Javaで:

public void delete(int position){
    myList.remove(position);
    notifyItemRemoved(position);
}

public int getSize(){
    return myList.size();
}

リスト全体ではなく、リスト内の他のすべてのアイテムが削除されると思います。

listviewを使用すると、とても簡単で、単にadapter.clear()と呼びました。

誰かがコードを修正するのを手伝ってくれますか?

notifyItemRangeRemoved(...,...);を使用する必要があると思いますが、どのようにすればよいかわかりません。 TIA

39
user2456977

これは私に最適です:

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

        notifyItemRangeRemoved(0, size);
    }
}

出典:https://github.com/mikepenz/LollipopShowcase/blob/master/app/src/main/Java/com/ mikepenz/lollipopshowcase/adapter/ApplicationAdapter.Java

または:

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

Forループでアイテムを削除したり、繰り返しごとにnotifyDataSetChangedを呼び出したりしないでください。代わりに、リストのmyList.clear();のc​​learメソッドを呼び出してから、アダプターに通知します

public void clearData() {
    myList.clear(); // clear list
    mAdapter.notifyDataSetChanged(); // let your adapter know about the changes and reload view.
}
57
Bojan Kseneman
setAdapter(null);

RecycleViewに異なるビュータイプがある場合に便利です

recyclerView.removeAllViewsInLayout();

上記の行は、レイアウトからすべてのビューを削除するのに役立ちます。

あなたのために:

@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

これは私がリサイクラビューをクリアし、アニメーションで新しいアイテムを追加した方法です:

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

自分自身を助ける:

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

ListViewclear()を使用します。

しかし、あなたがRecyclerViewのためにそれをしているだけなら。まず、notifyItemRangeRemoved(0,size)RecyclerView.Adapterをクリアする必要があります

次に、あなただけrecyclerView.removeAllViewsInLayout()

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

この機能を使用

0
Ebrahim Karimi

Xamarin.Androidでは、私にとってはうまく機能し、レイアウトを変更する必要があります

 var layout = recyclerView.GetLayoutManager() as GridLayoutManager;
 layout.SpanCount = GetItemPerRow(Context);
 recyclerView.SetAdapter(null);
 recyclerView.SetAdapter(adapter); //reset
0
Nien Nguyen

私の場合、空のリストを追加することでうまくいきました。

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

Recycleviewアイテムをクリアする別の方法は、新しい空のアダプターをインスタンス化することです。

mRecyclerView.setAdapter(new MyAdapter(this, new ArrayList<MyDataSet>()));

それはおそらく最も最適化されたソリューションではありませんが、魅力のように機能しています。

0
tryp