RecycleView的notifyDataSetChanged()方法无效

有几种情况会进行刷新数据无效

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()方法
        }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值