从 RecyclerView 中删除所有项目

问题描述 投票:0回答:15

我正在尝试在

RecyclerView
方法中删除
onRestart
中的所有元素,以便项目不会加载两次:

@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

android adapter android-recyclerview
15个回答
86
投票

这对我来说非常有用:

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

78
投票

避免在 for 循环中删除项目并在每次迭代中调用 notificationDataSetChanged。相反,只需调用列表中的clear方法

myList.clear();
,然后通知你的适配器

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

22
投票
setAdapter(null);

如果 RecycleView 有不同的视图类型,则很有用


21
投票
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();
}

3
投票

这就是我清除回收器视图并用动画添加新项目的方法:

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
投票

帮助自己:

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

3
投票

我用这个。这实际上完全清除了 recyclerview。我已经尝试过

adapter.notifyDataSetChanged();
但它只是没有更新我的案例中的任何视图。当然,U首先清除了列表。但下面的代码工作正常并完全清除了 recyclerview 的视图。

  listName.clear(); // clear list
                    
  adapter = new ModelAdaptor(Activity.this, listName);
  recyclerView.setAdapter(adapter);

0
投票

清除回收视图项目的另一种方法是实例化一个新的空适配器。

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

这可能不是最优化的解决方案,但它的效果非常好。


0
投票

ListView
使用
clear()

但是,如果您只是为了

RecyclerView
而这样做。首先你必须用
RecyclerView.Adapter
 清除你的 
notifyItemRangeRemoved(0,size)

那么,只有你

recyclerView.removeAllViewsInLayout()


0
投票

对于我的情况,添加一个空列表就可以完成任务。

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

0
投票
private void clearRecyclerView() {
    CustomListViewValuesArr.clear();
    customRecyclerViewAdapter.notifyDataSetChanged();
}

使用这个功能


0
投票

在 Xamarin.Android 上,它适用于我,需要更改布局

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

0
投票

您最好清除用于 recyleview 适配器的数组列表。

arraylist.clear();

0
投票

只需致电

recyclerView.setLayoutManager(null)

根据Android源码 这会导致

mLayout.removeAndRecycleAllViews(mRecycler);
 mLayout.removeAndRecycleScrapInt(mRecycler);
 mRecycler.clear();

in RecyclerView

-3
投票
public void clearData() {
    mylist.removeAll(mylist);
    mAdapter.notifyDataSetChanged();
    recyclerView.setAdapter(mAdapter);
}
© www.soinside.com 2019 - 2024. All rights reserved.