我有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是实现此目标的正确位置,但是我显然有错误的方法。如果您有更好的主意,我应该在哪里或如何处理,请分享。提前致谢。

最佳答案

首先,您不必每次在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

10-07 19:30