如果我们有一个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);
}
}
});
}
它通过位置而不是视图与模型保持一致。所以只有那些被用户点击的受影响的项目。谢谢
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句