猿问

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

我有ActivityGame一个TextView包含面数的。同样,Activity我有一个RecyclerView并且那个RecyclerView当然包含多个项目。这些项目有不同的标准编号。


例如,Par number inActivityGame是 3,现在在RecyclerViewitems 中,假设我有 1 个 par number 为 3 的项目,第二个有 2,第三个有 4。


如果一个项目的标准编号与 的标准编号相同ActivityGame,那么该项目的标准编号背景应该变成灰色。如果项目的标准件数大于 中的标准件数ActivityGame,则项目的标准件数背景应变为紫色。最后,如果它小于ActivityGamepar number,则该项目的 par number 背景应该变为蓝色。


这是我试图在适配器中做的事情,以使其工作:


@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是实现这一目标的正确位置,但我显然采用了错误的方法。如果您对我应该在哪里或如何处理这个问题有更好的想法,请分享。提前致谢。


繁星淼淼
浏览 136回答 2
2回答

www说

首先,您不必notifyDataSetChanged每次在函数中设置背景颜色时都调用onBindViewHolder。其次,您需要在函数中实现背景颜色的所有条件onBindViewHolder。我想建议如下实施。@Overridepublic void onBindViewHolder(@NonNull GameViewHolder holder, int position) {&nbsp; &nbsp; holder.mTextPar.setText(currentItem.getText2());&nbsp; &nbsp; Integer parFromActivity = -1;&nbsp; &nbsp; if(ActivityGame.mHoleNm != null)&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; parFromActivity = Integer.parseInt(ActivityGame.mHoleNm.getText().toString());&nbsp; &nbsp; /** If persons par number is smaller than course par number, then change persons par number background to blue **/&nbsp; &nbsp; if (Integer.parseInt(holder.mTextPar.getText().toString()) < parFromActivity) {&nbsp; &nbsp; &nbsp; &nbsp; holder.mTextPar.setBackgroundColor(Color.parseColor("#255eba"));&nbsp; &nbsp; &nbsp; &nbsp; // notifyDataSetChanged(); // We do not need this line&nbsp; &nbsp; } else if (Integer.parseInt(holder.mTextPar.getText().toString()) > parFromActivity) {&nbsp; &nbsp; &nbsp; &nbsp; holder.mTextPar.setBackgroundColor(Color.parseColor("#800080")); // purple maybe&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; holder.mTextPar.setBackgroundColor(Color.parseColor("#D3D3D3"));&nbsp; &nbsp; }}希望有帮助!编辑:我主要假设从活动中引用的视图是null在您从适配器中使用它时。如果是这种情况,那么您需要以其他方式将值传递给适配器。由于您已经发现了问题,因此我也将其包含在我的回答中。该视图不是唯一的Integer。因此,我想Integer.parseInt(ActivityGame.mHoleNm.getText().toString()是在扔东西ParseException。

幕布斯7119047

您的活动中不应该有静态小部件。相反,您应该将 par 编号作为参数传递给适配器构造函数,这样您就不必在活动中声明静态方法来获取 par 值。如果 par 值可能会实时更改,则向您的适配器添加一个方法以获取新的 par 值,然后刷新适配器项目。只要面值发生变化,就会从活动中调用该方法。
随时随地看视频慕课网APP

相关分类

Java
我要回答