2017-05-21 5 views
0

私はrecyclerViewdatabindingと使用しています。 それはうまく動作しますが、onBindViewHolderメソッド内のバインディングモデルを変更しようとすると、私は奇妙な動作をします。そのメソッドは繰り返し実行されます。ここ は私adapterです:Android。モデルを変更すると、onBindViewHolder内のメソッドが繰り返し実行されます

public class TasksLevelAdapter extends RealmRecyclerViewAdapter<RealmArticle, TasksLevelAdapter.MyViewHolder> { 

    private String TAG = "MYAPP"; 

    protected TasksLevelAdapter(OrderedRealmCollection<RealmArticle> data, Activity mActivity) { 
     super(data, true); 
     setHasStableIds(true); 
     this.mActivity = mActivity; 
    } 

    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater layoutInflater = 
       LayoutInflater.from(parent.getContext()); 
     RowRecyclerviewMainBinding itemBinding = 
       RowRecyclerviewMainBinding.inflate(layoutInflater, parent, false); 
     return new MyViewHolder(itemBinding); 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     final RealmArticle obj = getItem(position); 
     int idTask = obj.getIdTask(); 
     holder.data = obj; 
     holder.bind(obj); 
     Log.e(TAG, new Date().getTime() + ""); 
     new Handler().postDelayed(new Runnable() { // - when I add this handler I'm getting it called repeatedly 
      @Override 
      public void run() { 
       Realm.getDefaultInstance() 
         .executeTransaction(trans -> obj.setItemsCount("111")); 
      } 
     }, 1000); 
    } 

    @Override 
    public long getItemId(int index) { 
     return getItem(index).getIdTaskart(); 
    } 

    class MyViewHolder extends RecyclerView.ViewHolder { 
     private final RowRecyclerviewMainBinding binding; 
     private RealmArticle data; 
     public MyViewHolder(RowRecyclerviewMainBinding binding) { 
      super(binding.getRoot()); 
      this.binding = binding; 
     } 
     public void bind(RealmArticle obj) { 
      binding.setObj(obj); 
      binding.executePendingBindings(); 
     } 
    } 
} 

そして、私はonBindViewHolderhandlerを削除すると、Log.eは一度だけ実行されます。

モデルを変更したときにOnbindViewHolderのメソッドが繰り返し実行されるのはなぜですか?そしてこれを避ける方法は?

答えて

1

あなたは有効に自動更新を使用してアダプタを作成:

super(data, true); 

あなたの投稿Runnableの中であなたがバインドされたオブジェクトのデータを変更するため、更新がトリガされます。これがonBindViewHolder()が再度呼び出された理由です。

自動更新とデータバインディングを併用すると少し冗長に見えます。 RealmArticleがデータバインディング可観測性の場合、更新プログラムの自動更新を使用しない可能性があります。だからupdateOnModificationを無効にするだけです。

super(data, true, false); 
+0

ありがとう!しかし、スーパー(データ、偽) – Rainmaker

関連する問題