android成神之路View猿湿Xoong的技术栈

notifyDataSetChanged对RecyclerVie

2017-02-18  本文已影响207人  是天哥哥啊

今天在项目中发现怎么使用notifyDataSetChanged刷新数据都没用,千看百看,忽然灵感一来,记得以前也有这样的情况,赶紧记录在案以防我的笨脑瓜子又忘了。

关键点:notifyDataSetChanged只负责对你第一次设置的数据源进行“监听”。假如在中途你的数据源地址(引用)发生了改变,再去调用notifyDataSetChanged将不会生效。

错误使用场景(逻辑)

/*createNewData返回新生成的数据数组*/
ArrayList<String> createNewData() {
    ArrayList<String> newData = new ArrayList<>();
    get data;
    return newData;
}
//...
ArrayList<String> mData;
//...
mData = createNewData();
mAdapter = new Adapter(mData);
mRecyclerView.setAdapter(mAdapter);

void onClick {
    updateData();
}

void updateData() {
    mData = createNewData();
    mAdapter.notifyDataSetChanged();
}

在上述情况下,当需要重新生成数据的时候,再次调用createNewData,notifyDataSetChanged是不可能起作用的。
因为mData的地址引用的list已经不是第一次传给Adapter的那个mData的引用了。

正确使用场景(逻辑)

/*createNewData返回新生成的数据数组*/
ArrayList<String> createNewData() {
    ArrayList<String> newData = new ArrayList<>();
    get data;
    return newData;
}
//...
ArrayList<String> mData;
//...
mData = new ArrayList<>();
mData.addAll(createNewData());
mAdapter = new Adapter(mData);
mRecyclerView.setAdapter(mAdapter);

void onClick {
    updateData();
}

void updateData() {
    mData.clear();
    mData.addAll(createNewData());
    mAdapter.notifyDataSetChanged();
}

而在这种情况下,因为mData的地址已经固定,只是对其内容进行增删,通过调用notifyDataSetChanged则可以判断mData是否发生了变化从而刷新UI。

DEMO

最后附上demo地址, 简单展现了这两种情况。

效果图
上一篇 下一篇

猜你喜欢

热点阅读