【Android】MVVM架构 RecyclerView加载数据滑动到后面,数据错乱,点击事件失效问题

问题分析:

recyclerview 更新数据和UI过程是:获取holder类型->产生holder->获取holder()->holder+data->展示。

getItemViewType() -> onCreateViewHolder() -> onBindViewHolder()

adapter中:

1.获取某个位置的holder类型。

@Override
    public int getItemViewType(int position) {
        return position;
    }

2.创建holder 。

@NonNull
    @Override
    public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 创建绑定关系
        ViewDataBinding viewDataBinding = DataBindingUtil.inflate(inflater, layoutId, parent, false);
        // 建立ViewHolder
        RecyclerViewHolder viewHolder = new RecyclerViewHolder(viewDataBinding.getRoot());
        // 将绑定关系设置到ViewHolder
        viewHolder.setViewDataBinding(viewDataBinding);
        return viewHolder;
    }

3.绑定数据并展示出来。 

@Override
    public void onBindViewHolder(@NonNull RecyclerViewHolder holder, final int position) {
        // 从ViewHolder中取出绑定关系
        ViewDataBinding viewDataBinding = holder.getViewDataBinding();
        // 执行绑定,给绑定关系设置数据。
        viewDataBinding.setVariable(variableId, data.get(position));
        // 立即执行
        viewDataBinding.executePendingBindings();
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onItemClickListener.onItemClick(position);
            }
        });
    }

自定义ViewHolder 

public static class RecyclerViewHolder extends RecyclerView.ViewHolder {

        private ViewDataBinding mViewDataBinding;

        public RecyclerViewHolder(@NonNull View itemView) {
            super(itemView);
        }

        public ViewDataBinding getViewDataBinding() {
            return mViewDataBinding;
        }

        public void setViewDataBinding(ViewDataBinding viewDataBinding) {
            mViewDataBinding = viewDataBinding;
        }
    }

 

由于RecyclerView的onBindViewHolder()方法,只有在getItemViewType()返回类型不同时才会调用,

在onBindViewHolder()方法中,执行了了viewDataBinding.setVariable(variableId, data.get(position));

每次都调用了onBindViewHolder()刷新item数据,就需要重写getItemViewType(),让其返回position,否则很容易产生数

据错乱。

 

你可能感兴趣的:(Android)