当我必须使用经典适配器时ListView https://developer.android.com/guide/topics/ui/layout/listview.html,我在 ListView 中更新数据,如下所示:
myAdapter.swapArray(data);
public swapArray(List<Data> data) {
clear();
addAll(data);
notifyDataSetChanged();
}
我想知道什么是最佳实践回收视图 https://developer.android.com/training/material/lists-cards.html。因为在一个回收视图适配器你不能做clear
and addAll
as in ListView.
所以我尝试了一个notifyDataSetChanged
,但没有成功。
然后我在我的视图中尝试使用 swapAdapter:
List<Data> data = newData;
MyRecyclerAdapter adapter = new MyRecyclerAdapter(data);
// swapAdapter on my recyclerView (instead of a .setAdapter like with a classic listView).
recyclerViewList.swapAdapter(adapter, false);
但对于最后一个解决方案,我仍然必须创建适配器的新实例,我觉得这不是最好的解决方案。我应该能够只更改我的数据而无需新的MyRecyclerAdapter
.
RecyclerView 的适配器没有提供许多 ListView 适配器中可用的方法。但你的交换可以非常简单地实现为:
class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
List<Data> data;
...
public void swap(ArrayList<Data> datas)
{
data.clear();
data.addAll(datas);
notifyDataSetChanged();
}
}
之间也有区别
list.clear();
list.add(data);
and
list = newList;
第一个是重用相同的列表对象。另一个是取消引用和引用列表。无法再访问的旧列表对象将被垃圾收集,但首先会堆积堆内存。这与每次想要交换数据时初始化新适配器相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)