RecycleView的notifyDataSetChanged

2018-08-07  本文已影响13人  OneXzgj
有几种情况会进行刷新数据无效

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()方法
        }

上一篇下一篇

猜你喜欢

热点阅读