使用 RecyclerView 时如何处理与视图交互的 UI 变化?

How to handle UI changes from interaction with a view when using a RecyclerView?

如果我们有一个 RecyclerView 将具有不同类型的视图,我们可以根据项目类型扩展我们需要的视图,例如

@Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
        View view = null;
        switch (type) {
            case TYPEX:  
               view = LayoutInflater
                    .from(viewGroup.getContext())
                    .inflate(R.layout.typex, viewGroup, false);
                    return new ViewHolderX(view);
            case TYPEY:
                view = LayoutInflater
                    .from(viewGroup.getContext())
                    .inflate(R.layout.typey, viewGroup, false);
                return new ViewHolderY(view);
        }
        return null;
    }

到目前为止一切顺利。这些视图随后可在 ViewHolder

中重复使用

问题:
如果 TYPEX 视图有一个按钮,按下该按钮会更改视图中的某些内容,例如背景颜色,这意味着当视图被回收时,用户从未按下按钮的其他项目的颜色将不同。
由于它与视图必须从适配器显示的数据的任何条件无关,因此如何解决这个问题?

您应该将 属性 [背景颜色] 存储在模型中,并据此做出决定。

class Model {

    ...

    private int backgroundColor = 0xFFFFFF;

    public int getBackgroundColor() {
        return backgroundColor;
    }

    public void setBackgroundColor(int backgroundColor) {
        this.backgroundColor = backgroundColor;
    }

    ...

}

处理单击此处并更新背景颜色。

@Override
public void onBindViewHolder(@NonNull final SuggestionHomeAdapter.ViewHolder holder, final int position) {

    final Model model = modelItems.get(position);

    holder.rootView.setBackgroundColor(model.getBackgroundColor());

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(model.getBackgroundColor() != 0xFFFF0000){
                model.setBackgroundColor(0xFFFF0000);
                notifyItemChanged(position);
            }
        }
    });
}

它通过位置而不是视图与模型保持一致。因此,只有用户点击的那些受影响的项目。谢谢