我开始在我的新学校项目中使用RecyclerView
并将RealmDB
作为数据源。到目前为止,在刷新列表视图之前,它还可以。这是demo。由于notifyDataSetChanged()
,会出现黑屏闪烁。如果我想让它不那么明显,我可以设置白色背景而不是黑色。
但是我应该使用什么机制来完全消除明显的屏幕闪烁?如果我能获得与here
相同的结果,我将非常感激到目前为止,我如何刷新列表视图?
步骤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)
。闪烁消失,动画变得更加流畅: - )
答案 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));
}
}