Ale*_*xDG 73 android listview android-adapter android-recyclerview
当我必须使用带有ListView的经典适配器时,我在ListView中更新我的数据,如下所示:
myAdapter.swapArray(data);
public swapArray(List<Data> data) {
  clear();
  addAll(data);
  notifyDataSetChanged();
}
我想知道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);
但是使用这个最后的解决方案,我仍然需要创建我的适配器的新实例,我觉得它不是最好的解决方案.我应该能够在没有新的情况下更改我的数据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();     
    }
}
还有一个区别
list.clear();
list.add(data);
和
list = newList;
第一个是重用相同的列表对象.另一种是解除引用和引用列表.无法再访问的旧列表对象将被垃圾收集,但不是没有首先堆积堆内存.这与每次要交换数据时初始化新适配器相同.
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();
    }
我正在使用Retrofit获取列表,在Retrofit的onResponse()使用中,
adapter.swap(feedList);
发现以下解决方案适用于我的类似问题:
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();
}
使用清除命令
mData.clear()
不是必需的
| 归档时间: | 
 | 
| 查看次数: | 99032 次 | 
| 最近记录: |