使用 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);
}
}
});
}
它通过位置而不是视图与模型保持一致。因此,只有用户点击的那些受影响的项目。谢谢
如果我们有一个 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);
}
}
});
}
它通过位置而不是视图与模型保持一致。因此,只有用户点击的那些受影响的项目。谢谢