如何正确刷新我的Recycler List View

时间:2016-08-18 04:10:24

标签: android performance android-recyclerview realm swiperefreshlayout

我开始在我的新学校项目中使用RecyclerView并将RealmDB作为数据源。到目前为止,在刷新列表视图之前,它还可以。这是demo。由于notifyDataSetChanged(),会出现黑屏闪烁。如果我想让它不那么明显,我可以设置白色背景而不是黑色。

但是我应该使用什么机制来完全消除明显的屏幕闪烁?如果我能获得与here

相同的结果,我将非常感激

到目前为止,我如何刷新列表视图?

  • 步骤1.我将web api称为收到的帖子
  • 步骤2.获取结果并更新或将其添加到#realm

    mRealm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
        for (Post post : posts) {
            //create post
            realm.copyToRealmOrUpdate(post);
            //create common result row
            CommonResult cr = new CommonResult();
            int id = module.hashCode() + post.getId();
            cr.setId(id);
            cr.setPost(post);
            cr.setPostid(post.getId());
            cr.setTag(module.hashCode());
            realm.copyToRealmOrUpdate(cr);
        }
    }
    }, new Realm.Transaction.OnSuccess() {
       @Override
       public void onSuccess() {
       RealmResults<CommonResult> cr = mRealm.where(CommonResult.class)
           .equalTo("tag", module.hashCode())
           .findAll();
       mPostView.showListingView(cr, hasNext());
    }
    });
    
  • 步骤3. Realm将通知对适配器的更改,通知块将在回收器适配器上调用notifyDataSetChanged()

在我的适配器(RecyclerView.Adapter

this.data.addChangeListener(new RealmChangeListener<RealmResults<CommonResult>>() {
    @Override
    public void onChange(RealmResults<CommonResult> element) {
        notifyDataSetChanged();
    }
});

更新 我已将notifyDataSetChanged()更改为notifyItemChanged(i, element)。闪烁消失,动画变得更加流畅: - )

1 个答案:

答案 0 :(得分:0)

大家感谢您的评论,我通过取消使用notifyDataSetChanged()来解决问题。

更改
this.data.addChangeListener(new RealmChangeListener<RealmResults<CommonResult>>() {
    @Override
    public void onChange(RealmResults<CommonResult> element) {
        notifyDataSetChanged();
    }
});

 this.data.addChangeListener(new RealmChangeListener<RealmResults<CommonResult>>() {
            @Override
            public void onChange(RealmResults<CommonResult> element) {
                notifyItems(element);
                Timber.i("onChange() called with: element = [" + element + "]");
            }
        });


private void notifyItems(RealmResults<CommonResult> element){
        for (int i = 0; i < element.size(); i++) {
            notifyItemChanged(i, element.get(i));
        }
    }