代码之家  ›  专栏  ›  技术社区  ›  ZarNi Myo Sett Win

在recyclerview android中更改viewholder的子视图颜色

  •  0
  • ZarNi Myo Sett Win  · 技术社区  · 7 年前

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

    所以,我点击了第一个打印按钮并打印,按钮的颜色也变为黄色。到这里来还是可以的。但是,问题是在滚动到一定距离后,我发现一些按钮的颜色也变为黄色,尽管它没有打印出来。

    这是我在onClick()方法中更改打印按钮颜色的ViewHolder。

    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中viewholder的子视图(按钮)颜色 任何想法或其他方式都值得欣赏!

    2 回复  |  直到 7 年前
        1
  •  2
  •   Ashutosh Sagar    7 年前

        2
  •  2
  •   Zun Juliano Moraes    7 年前

    这是因为RecyclerView是如何工作的。在视图从屏幕上消失后,它会回收视图。如果要维护视图的状态,可以在列表中跟踪它。适配器中的示例代码:

    private ArrayList<Integer> idsOfAllItemsThatHaveBeenPrinted = new ArrayList<>();
    

    然后在打印完之后,您可以在列表中添加一些标识符

    idsOfAllItemsThatHaveBeenPrinted.add(1);
    

    onBindViewHolder 你可以检查一下你的 searchResponseList.get(position) 就在那个列表里。如果它位于ArrayList中,请将背景颜色更改为蓝色。如果是 如果不是,则将其更改为黄色

    IB17InventorySearchResponse x = searchResponseList.get(position)
    if (idsOfAllItemsThatHaveBeenPrinted.contains(x.identifier)) {
    // change to blue
    else {
    // change to yellow
    }