在我的android应用程序中,我添加了一个recyclerview来显示打印项目的列表。每个项目视图都代表要打印的信息,并且还具有一个进行打印的按钮。打印按钮的颜色在打印前为浅蓝色,在打印后将变为黄色。 (打印代码将在此处执行)
因此,我单击了第一个打印按钮并进行了打印,按钮的颜色也更改为黄色(图2)。这里还是可以的。但是,问题是滚动到一定距离后,我发现一些按钮虽然未打印,但颜色也变为黄色。 (图3)。
这是我的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();
}}
我的问题是我应该如何在recyclerview中更改查看器的子视图(按钮)颜色,而又不影响其他itemview子视图(查看器按钮)?任何想法或其他方式都值得赞赏!
答案 0 :(得分:3)
这是因为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
}
答案 1 :(得分:2)
您可以做的是,向列表所组成的PoJo类中添加一个布尔字段。默认情况下,它们全都是假的。当您按下打印按钮时,将该值设置为true并通知适配器进行数据更改。现在,如果该字段为true,则将颜色设置为黄色,否则为绿色(或您设置的任何颜色)。