繁体   English   中英

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

[英]Set background color programmatically on RecyclerView item (certain element in item)

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

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

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

首先,你不必叫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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM