Ale*_*xDG 73 android listview android-adapter android-recyclerview
当我必须使用带有ListView的经典适配器时,我在ListView中更新我的数据,如下所示:
myAdapter.swapArray(data);
public swapArray(List<Data> data) {
clear();
addAll(data);
notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
我想知道RecyclerView的最佳实践是什么.因为在RecyclerView适配器,你不能做clear,并addAll在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);
Run Code Online (Sandbox Code Playgroud)
但是使用这个最后的解决方案,我仍然需要创建我的适配器的新实例,我觉得它不是最好的解决方案.我应该能够在没有新的情况下更改我的数据MyRecyclerAdapter.
inm*_*yth 108
RecyclerView的适配器没有附带ListView适配器中提供的许多方法.但是您的交换可以非常简单地实现:
class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
List<Data> data;
...
public void swap(ArrayList<Data> datas)
{
data.clear();
data.addAll(datas);
notifyDataSetChanged();
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个区别
list.clear();
list.add(data);
Run Code Online (Sandbox Code Playgroud)
和
list = newList;
Run Code Online (Sandbox Code Playgroud)
第一个是重用相同的列表对象.另一种是解除引用和引用列表.无法再访问的旧列表对象将被垃圾收集,但不是没有首先堆积堆内存.这与每次要交换数据时初始化新适配器相同.
Aks*_*yal 21
@ inmyth的答案是正确的,只需修改一下代码,就可以处理空列表了.
public class NewsAdapter extends RecyclerView.Adapter<...> {
...
private static List mFeedsList;
...
public void swap(List list){
if (mFeedsList != null) {
mFeedsList.clear();
mFeedsList.addAll(list);
}
else {
mFeedsList = list;
}
notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Retrofit获取列表,在Retrofit的onResponse()使用中,
adapter.swap(feedList);
Run Code Online (Sandbox Code Playgroud)
发现以下解决方案适用于我的类似问题:
private ExtendedHashMap mData = new ExtendedHashMap();
private String[] mKeys;
public void setNewData(ExtendedHashMap data) {
mData.putAll(data);
mKeys = data.keySet().toArray(new String[data.size()]);
notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
使用清除命令
mData.clear()
Run Code Online (Sandbox Code Playgroud)
不是必需的
| 归档时间: |
|
| 查看次数: |
99032 次 |
| 最近记录: |