以编程方式在RecyclerView项上设置背景色(项中的某些元素)

时间:2019-07-26 18:58:28

标签: java android android-recyclerview

我有ActivityGame,其中的TextView包含票证号码。在同一个Activity中,我有一个RecyclerView,而那个RecyclerView当然包含多个项目。这些项目具有不同的面值。

例如,ActivityGame中的面值是3,现在RecyclerView中是项,假设我有1个项的面值是3,第二个是2,第三个是4。 >

如果某项的票号与ActivityGame的票号相同,则该票的票号背景应变为灰色。如果项目的面值大于ActivityGame中的面值,则项目的面值背景应更改为紫色。最后,如果商品的票面号小于ActivityGame,则该商品的票面号背景应变为蓝色。

这是我试图在适配器中进行的操作,以使这项工作有效:

@Override
public void onBindViewHolder(@NonNull GameViewHolder holder, int position) {
    holder.mTextPar.setText(currentItem.getText2());

    /** If persons par number is smaller than course par number, then change persons par number background to blue **/
    if (Integer.parseInt(holder.mTextPar.getText().toString()) < Integer.parseInt(ActivityGame.mHoleNm.getText().toString())) {
        holder.mTextPar.setBackgroundColor(Color.parseColor("#255eba"));
        notifyDataSetChanged();
    }
}

这是我认为可行的方法,但是当我尝试打开发生所有这些情况的ActivityGame时,它并没有立即崩溃。

我认为onBindViewHolder是实现此目标的正确位置,但是我显然使用了错误的方法。如果您有更好的主意,我应该在哪里或如何处理,请分享。预先感谢。

2 个答案:

答案 0 :(得分:0)

您的活动中不应包含静态小部件。相反,您应该将参数号作为参数传递给适配器构造函数,这样就不必在活动中声明静态方法来获取参数值。

如果par值可能实时更改,则向适配器添加一个方法以采用新的par值,然后刷新适配器项。每当par值更改时,都会从活动中调用该方法。

答案 1 :(得分:0)

首先,您不必每次在notifyDataSetChanged函数中设置背景颜色时都调用onBindViewHolder

第二,您需要在onBindViewHolder函数中实现背景色的所有条件。

我想建议一个类似以下的实现。

@Override
public void onBindViewHolder(@NonNull GameViewHolder holder, int position) {
    holder.mTextPar.setText(currentItem.getText2());
    Integer parFromActivity = -1;
    if(ActivityGame.mHoleNm != null) 
        parFromActivity = Integer.parseInt(ActivityGame.mHoleNm.getText().toString());

    /** If persons par number is smaller than course par number, then change persons par number background to blue **/
    if (Integer.parseInt(holder.mTextPar.getText().toString()) < parFromActivity) {
        holder.mTextPar.setBackgroundColor(Color.parseColor("#255eba"));
        // notifyDataSetChanged(); // We do not need this line
    } else if (Integer.parseInt(holder.mTextPar.getText().toString()) > parFromActivity) {
        holder.mTextPar.setBackgroundColor(Color.parseColor("#800080")); // purple maybe
    } else {
        holder.mTextPar.setBackgroundColor(Color.parseColor("#D3D3D3"));
    }
}

希望有帮助!

编辑:

从根本上讲,我假设从适配器中使用该视图时,从活动引用的视图是null。如果是这种情况,则需要以其他方式将值传递给适配器。

当您已经发现问题时,我也将其包含在答案中。该视图仅不具有Integer。因此,Integer.parseInt(ActivityGame.mHoleNm.getText().toString()正在抛出我猜想的ParseException