我有一个 RecyclerView
,它显示 Realm
数据库中的项目。
为此,我基于 realm-android-adapters 实现了 RealmRecyclerViewAdapter
它获取传入的 OrderedRealmCollection
。
为此,我使用 findAllAsync()
realm.where(Entry.class).findAllAsync()
当用户滚动列表时,他可以选择“收藏”某些条目,我在“收藏”按钮上使用普通的 OnClickListener
实现了这一点。
现在,每当用户单击按钮时,我都希望更新条目的“最喜欢的” bool 值。用户单击后,按钮上会显示一个小动画。
为此,我尝试了以下方法,遗憾的是给出了错误的线程异常:
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
entry.setLiked(!entry.isLiked());
}
});
作为替代方案,我尝试使用正常的 executeTransaction
,它可以工作,但会阻止显示动画。
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
entry.setLiked(!entry.isLiked());
}
});
作为一个有趣的补充,这给出了以下日志:
Mixing asynchronous queries with local writes should be avoided. Realm will convert any async queries to synchronous in order to remain consistent. Use asynchronous writes instead.
是否有可能完全异步更新项目而不引入延迟或阻止动画显示?
最佳答案
RealmRecyclerViewAdapter
在 Realm 自动更新时调用 adapter.notifyDataSetChanged()
,因此不会调用布局动画。
至于实际进行更改,
public class EntryViewHolder extends RecyclerView.ViewHolder {
@BindView(R.id.entry_favorite)
Button favButton;
public EntryViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
}
public void bind(Entry entry) {
final long entryId = entry.getId();
favButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Entry entry = realm.where(Entry.class)
.equalTo("id", id)
.findFirst();
if(entry != null) {
entry.deleteFromRealm();
}
}
});
}
});
}
}
关于android - 在 onClick 之后正确更新 RealmModel,而不阻塞 Android 中的 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38904951/