更改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

如何 android recyclerview 更改不同的持有者视图背景