2

我有一个RecyclerView显示Realm数据库中的项目。为此,我已经实现了一个RealmRecyclerViewAdapter基于realm-android-adapters的方法,它获得了OrderedRealmCollection传入。为此,我加载了数据findAllAsync()

realm.where(Entry.class).findAllAsync()

当用户滚动列表时,他可以选择“收藏”一些条目,我已经OnClickListener在“收藏”按钮上使用了一个普通的实现。

现在我很想在用户单击按钮时更新条目的“最喜欢的”布尔值。用户点击后,按钮上会显示一个小动画。

为此,我尝试了以下方法,遗憾的是给出了错误的线程异常:

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());
    }
});

作为一个有趣的补充,这给出了以下日志:

应避免将异步查询与本地写入混合使用。Realm 会将任何异步查询转换为同步查询以保持一致。请改用异步写入。

是否有可能在不引入延迟或阻止动画显示的情况下完全异步更新项目?

4

2 回答 2

2

RealmRecyclerViewAdapter当您的领域自动更新时调用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();
                         }
                     }
                 });
             }
        });
    }
}
于 2016-08-13T06:17:09.167 回答
0

在后台线程上执行此操作。我推荐使用经典的 Thread.class 启动动画 outisde new Thread,并通过 UI Thread 上的回调将其关闭。

Realm realm = Realm.getInstance(..);
realm.beginTransaction();
YourClass yourClassInstance = realm.where(YourClass.class)
        .equalTo(..)
        .findFirst();
if(yourClassInstance != null){
   yourClassInstance.setLiked(!yourClassInstance.getLiked());
}else{
   yourClassInstance = realm.createObject(YourClass.class);
   yourClassInstance.setLiked(whateverYouWant);
}
realm.commitTransaction();
于 2016-08-11T20:29:07.147 回答