有几种情况会进行刷新数据无效
1、数据源前后地址不一样
一般我们使用构造进行数据源的传递,或者是封装的CommonAdapter进行数据源的传递,或者是通过依赖注入框架进行,将数据源进行传递到Adapter中,一般容易在这种情况下出现notifyDataSetChanged()方法无效,解决的方法是:
定义一个成员的数据源的变量接受构造传入的数据,将构造传入的数据进行mData.addAll(data)的形式,进行将数据绑定。这样做的目的是 将数据源地址保持不变。
public void setNewData(@Nullable List<T> data) {
this.mData = data == null ? new ArrayList<T>() : data;
notifyDataSetChanged();
}
2、mAdapter在数据加载或者是页面重启的时候
地址不一样,假如Activity中的数据,在别的界面进行添加以后,当回到Activity这个页面的时候,我们应该刷新数据,但是有时候不会销毁当前的Activity,所以我们一般在onResume()中进行方法的重写,重新请求一遍数据,这样的话,我们的数据会刷新一遍,假如在创建Adapter的时候,没有做费控判断,这样的话,每次执行数据的刷新后,会重新创建一个Adapter,这样的话,使用mAdapter.notifyDataSetChange()方法,也是没有任何效果的。
mAdapter = new CommonAdapter<User >(this, R.layout.item_name,
mData) {
@Override
protected void convert(ViewHolder holder, final User u,
final int position) {
holder.setText(R.id.name, t.getName());
}
};
recyclerView.setAdapter(mAdapter);
代码如上图所示,没有任何的错误,但是区别是每当数据请求一次或者页面刷新一次,mAdapter的都会创建一个新的对象,即:也会造成刷新不起作用
3、标准的设置adapter的写法
项目使用mvp的架构模式的话,请求数据一般都是通过 presenter.getLoadData("0001");
类似这样的方法进行获取数据,将数据返回回来以后,在View层中,通过showData()这些方法将数据返回回来,下面贴代码
@Override
public void showData(List<User> data) {
swipeLayout.setRefreshing(false);
if (data != null) {
mData.clear();
mData.addAll(data);
}
if (mAdapter == null) {
mAdapter = new CommonAdapter<User>(this, R.layout.bgsb_item,
mData) {
@Override
protected void convert(ViewHolder holder, final Usert,
final int position) {
holder.setText(R.id.name, t.getUserName());
holder.setOnClickListener(R.id.tv_bi_delete,
MainActivity.this);
}
};
recyclerView.setAdapter(mAdapter);
} else {
mAdapter.notifyDataSetChanged();
// TODO 待优化,因为RecyclerView提供notifyItemDataSetChange()方法
}
网友评论