【问题标题】:Change clicked button's color on a recycler view containing buttons in each row在每行包含按钮的回收器视图上更改单击按钮的颜色
【发布时间】:2017-05-03 19:39:56
【问题描述】:

我在 RecyclerView 中添加了一些按钮,按钮是动态添加的,基于列表的大小。现在按钮已根据列表成功添加,我需要帮助的是,当我单击按钮时,该按钮应突出显示。当我单击另一个按钮时,先前单击的按钮应返回默认颜色,并且应突出显示新单击的按钮。

提前致谢。

【问题讨论】:

  • 请粘贴一些代码,以便我们了解您到目前为止所做的尝试
  • 代码在我的办公室电脑里,所以我现在无法粘贴。
  • 我尝试在单击时更改按钮的背景颜色,它可以工作,但是当我单击另一个按钮时,该按钮也会更改背景,但我希望已经选择的按钮返回默认颜色。
  • 我正是想要那个,stackoverflow 编辑器中的子标题(问题、工作、文档......)。当我单击“问题”选项卡时,它变为橙色,然后我单击“工作”选项卡,它变为橙色,但之前单击的“问题”选项卡恢复为默认的灰色。请帮助实现这一点。

标签: android arraylist dynamic android-recyclerview background-color


【解决方案1】:

将按钮的按钮集id添加到listitem的位置时

在 RecyclerView 的适配器中添加一个变量:

private int selectedItem = -1;

在 ClickOfButton 上将 selectedItem 设置为按钮位置。然后在 onBindViewHolder 中:

@Override
public void onBindViewHolder(VH viewHolder, int i) {
    // Set selected state; use a state list drawable to style the view
   if(selectedItem == i)
       viewHolder.itemView.findViewById(i).setBackground(..);
    }else{
     viewHolder.itemView.findViewById(i).setBackground(..);
     }
 }

【讨论】:

  • 它对我不起作用..最后生成的按钮只突出显示,但我没有点击那个按钮。
  • if(mSelecteditem == position){ holder.header_text.setBackgroundResource(R.color.cb_orange); }else { holder.header_text.setBackgroundResource(R.color.cb_blue); }
  • 我正是想要那个,stackoverflow 编辑器中的子标题(问题、工作、文档......)。当我单击“问题”选项卡时,它变为橙色,然后我单击“工作”选项卡,它变为橙色,但之前单击的“问题”选项卡恢复为默认灰色。请帮助实现这一点。
  • 能否在动态添加按钮的地方添加代码,并设置适配器。
【解决方案2】:

在你的适配器中添加一个变量:

private int previousSeletedButtonId = 0;

然后只需在按钮单击时检查 onBindViewHolder 内部

    @Override
        public void onBindViewHolder(VH viewHolder, int currentlySelectedButton) {

        viewHolder.itemView.findViewById(currentlySelectedButton).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        if(previousSeletedButtonId == currentlySelectedButton){
               viewHolder.itemView.findViewById(previousSeletedButtonId).setBackgroundColor(ContextCompat.getColor(context,R.color.orange));
        }
        else{
            viewHolder.itemView.findViewById(previousSeletedButtonId).setBackgroundColor(grey);
            viewHolder.itemView.findViewById(currentlySelectedButton).setBackgroundColor(orange);
            }
        }
      });
     }

希望对您有所帮助。 记住不要忘记点击其他部分时保存按钮的ID。

currentlySelectedButton = previousSeletedButtonId;

【讨论】:

    【解决方案3】:

    我选择将代码放在 ViewHolder 内的 OnClick 中,但它应该可以在任何地方工作。使用 previousSeletedButton,您每次都可以访问之前选择的按钮:

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    
        public Button aButton;
        public static Button previousSeletedButton = null;
        private Context context;
    

    .....

    // Handles the row being clicked
    @Override
    public void onClick(View view) {
    
            if ( ( previousSeletedButton == null ) || ( previousSeletedButton == this.aButton ) ) {
                this.aButton.setBackgroundColor( ContextCompat.getColor( context, R.color.orange) );
            }
            else{
                previousSeletedButton.setBackgroundColor( ContextCompat.getColor( context, R.color.grey) );
                this.aButton.setBackgroundColor( ContextCompat.getColor( context, R.color.orange) );
            }
            previousSeletedButton = this.aButton;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 2018-07-28
      • 1970-01-01
      • 2021-07-07
      • 2018-02-08
      相关资源
      最近更新 更多