在RecyclerView Android中更改Viewholder的子视图颜色

时间:2018-11-28 10:14:57

标签: android android-recyclerview

在我的android应用程序中,我添加了一个recyclerview来显示打印项目的列表。每个项目视图都代表要打印的信息,并且还具有一个进行打印的按钮。打印按钮的颜色在打印前为浅蓝色,在打印后将变为黄色。 (打印代码将在此处执行)

enter image description here

因此,我单击了第一个打印按钮并进行了打印,按钮的颜色也更改为黄色(图2)。这里还是可以的。但是,问题是滚动到一定距离后,我发现一些按钮虽然未打印,但颜色也变为黄色。 (图3)。

enter image description here

enter image description here

这是我的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子视图(查看器按钮)?任何想法或其他方式都值得赞赏!

2 个答案:

答案 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,则将颜色设置为黄色,否则为绿色(或您设置的任何颜色)。