Android系统。当我更改模型时,onBindViewHolder中的任何方法都会重复执行

时间:2017-05-21 10:24:29

标签: android android-databinding

我将recyclerViewdatabinding一起使用。 它工作正常,但是当我试图在onBindViewHolder方法中更改绑定模型时,我得到一个奇怪的行为:该方法重复执行。 这是我的adapter

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

当我在handler内删除onBindViewHolder时,Log.e只执行一次。

为什么更改模型时OnbindViewHolder内的方法会反复执行?以及如何避免这种情况?

1 个答案:

答案 0 :(得分:1)

您可以在启用自动更新的情况下创建适配器:

super(data, true);

在发布的Runnable内,您可以更改绑定对象的数据,从而触发更新。这就是再次调用onBindViewHolder()的原因。

一起使用自动更新和数据绑定似乎有点多余。如果RealmArticle是数据绑定可观察对象,则可能不使用自动更新进行更新。所以只需禁用updateOnModification

super(data, true, false);