更改recyclerview android的子视图颜色
Posted
技术标签:
【中文标题】更改recyclerview android的子视图颜色【英文标题】:Changing child view color of recyclerview android 【发布时间】:2019-04-30 05:12:49 【问题描述】:在我的 android 应用程序中,我添加了一个 recyclerview 来显示打印项目列表。每个项目视图代表一个要打印的信息,并且还有一个用于打印的按钮。打印按钮颜色在打印前为浅蓝色,打印后变为黄色。 (打印代码会在这里执行)
所以,我点击了第一个打印按钮并打印,按钮颜色也变成了黄色。到这里还是可以的。但是,问题是滚动到一段距离后,我发现一些按钮的颜色也变成了黄色,尽管它没有打印出来。
这是我的 ViewHolder,我在 onClick() 方法中更改了打印按钮的颜色。
public class IB17InventorySearchViewHolder extends BaseViewHolder<IB17InventorySearchResponse>
@BindView(R.id.tv_location)
TextView tvLocation;
@BindView(R.id.tv_tuNo)
TextView tvTuNo;
@BindView(R.id.tv_sku)
TextView tvSku;
@BindView(R.id.tv_lot_no)
TextView tvLotNo;
@BindView(R.id.tv_qty)
TextView tvQty;
@BindView(R.id.btn_print)
Button btnPrint;
IB17InventorySearchResponse inventorySearchResponse;
private Activity mActivity;
public IB17InventorySearchViewHolder(View itemView, Activity mActivity)
super(itemView);
this.mActivity = mActivity;
@Override
public void setData(IB17InventorySearchResponse data)
this.inventorySearchResponse = data;
tvLocation.setText(data.getLoccode());
tvTuNo.setText(data.getTuno1());
tvSku.setText(data.getSkucode());
tvLotNo.setText(data.getLot4());
tvQty.setText(String.valueOf(data.getQty()));
btnPrint.setOnClickListener(this);
@Override
public void onClick(View v)
if (v.getId() == R.id.btn_print)
if(BluetoothPrintHelper.printSucess)
btnPrint.setBackgroundColor(Color.parseColor("#fff111"));
else
// for whole itemview click
`
这是我的适配器
public class IB17InventorySearchRecyAdapter extends BaseRecyclerAdapter<BaseViewHolder, BaseModel>
private List<IB17InventorySearchResponse> searchResponseList;
public Context context;
public IB17InventorySearchRecyAdapter(Context context, List<IB17InventorySearchResponse> searchResponseList)
super(context);
this.context = context;
this.searchResponseList = searchResponseList;
@NonNull
@Override
public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.ib17_search_result_row, parent, false);
return new IB17InventorySearchViewHolder(view, (Activity) context);
@Override
public void onBindViewHolder(BaseViewHolder holder, final int position)
holder.setData(searchResponseList.get(position));
@Override
public int getItemCount()
return searchResponseList.size();
我的问题是我应该如何在不影响其他 itemview 子项(viewholder 按钮)的情况下更改 recyclerview 中查看器的子视图(按钮)颜色任何想法或替代方法都在欣赏!
【问题讨论】:
添加布尔标志,用于存储按钮的状态并根据其值设置按钮的颜色。 后来问了这个问题,我发现了一篇很棒的文章,用于在回收器视图中处理视图状态android.jlelse.eu/… 【参考方案1】:您可以做的是,将一个布尔字段添加到组成列表的 PoJo 类中。默认情况下,它们都将是错误的。当您按下打印按钮时,将值设置为 true 并通知适配器数据更改。现在设置如果该字段为真,则颜色将为黄色,否则为绿色(或您设置的任何值)。
【讨论】:
将此与我的答案进行比较,我更喜欢这个。似乎是更简单的方法。 谢谢@Ashutosh,我现在就试试。【参考方案2】:这是因为 RecyclerView 的工作原理。它会在您从屏幕上消失后回收您的视图。如果要维护视图的状态,可以在列表中跟踪它。适配器中的示例代码:
private ArrayList<Integer> idsOfAllItemsThatHaveBeenPrinted = new ArrayList<>();
然后在打印完东西之后,你可以在列表中添加一些标识符
idsOfAllItemsThatHaveBeenPrinted.add(1);
现在回到您的onBindViewHolder
,您可以检查您的searchResponseList.get(position)
是否在该ArrayList 中。如果它在 ArrayList 中,则将背景颜色更改为蓝色。如果它不是,则将其更改为黄色
IB17InventorySearchResponse x = searchResponseList.get(position)
if (idsOfAllItemsThatHaveBeenPrinted.contains(x.identifier))
// change to blue
else
// change to yellow
【讨论】:
谢谢@ZUNJAE,让我试试。 您可以对这个主题有更多的了解:***.com/questions/6711592/… 像这样解决这个问题是不好的做法,你应该使用带有 boolean 的 pojo 类,而不是制作全新的列表,这会增加 O(n) 的时间和空间复杂度。 RecyclerView 的工作方式是从 ArrayList 加载模型并回收其视图。此 ArrayList 是只读的。从此 ArrayList 更改模型上的值(您所谓的带有布尔值的类)并不意味着 ArrayList 得到更新。以上是关于更改recyclerview android的子视图颜色的主要内容,如果未能解决你的问题,请参考以下文章
在recyclerview项目android中更改视图之间的焦点
焦点更改时强制 RecyclerView 滚动(Android TV)
在recyclerview android中以编程方式更改布局管理器
recyclerview viewholder布局中的更改约束 - android
Android Kotlin viewBinder - 从 Activity 更改 RecyclerView Item 的 ItemView