2016-08-11 25 views
1

我有一个RecyclerView,它显示来自Realm数据库的项目。 要做到这一点我已经实现了一个基于realm-android-adapters一个RealmRecyclerViewAdapter它得到一个OrderedRealmCollection传入。 为此,我加载数据与findAllAsync()在onClick后正确更新RealmModel而不会阻止Android中的UI

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会将任何异步查询转换为同步以保持一致。改用异步写入。

是否有任何可能性更新项目完全异步,而不引入延迟或阻止显示动画?

回答

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

你是正确的它只是涉及到'adapter.notifyDataSetChanged()'防止应用程序。完全忽略了这一点,每次我更新时也会触发。谢谢 – mikepenz

0

在背景线程上执行此操作。我推荐使用经典的Thread.class .Start动画,并将其放在新的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();