美文网首页
RecycleView的notifyDataSetChanged

RecycleView的notifyDataSetChanged

作者: OneXzgj | 来源:发表于2018-08-07 09:03 被阅读13次
    有几种情况会进行刷新数据无效

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

    相关文章

      网友评论

          本文标题:RecycleView的notifyDataSetChanged

          本文链接:https://www.haomeiwen.com/subject/pregvftx.html