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

Android. Any method inside onBindViewHolder executes repeatedly when I change model

我正在使用 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();
        }
    }
}

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

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

您创建了启用了自动更新的适配器:

super(data, true);

在您发布的 Runnable 中,您更改了绑定对象的数据,因此触发了更新。这就是再次调用 onBindViewHolder() 的原因。

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

super(data, true, false);