【问题标题】:How to change the color of vector assigned to ImageButton in a RecyclerView?如何在 RecyclerView 中更改分配给 ImageButton 的矢量颜色?
【发布时间】:2017-07-01 07:25:09
【问题描述】:

我有一个 recyclerview,它显示了几个 (8) 卡片视图。在每个卡片视图中,有几个元素,如文本、图像按钮等。在适配器类(RvAdapter 扩展 RecyclerView.Adapter)中,我有如下代码。我想要做的是使用同一按钮的 OnClickListener 更改分配给 imagebutton 的 Vector (.xml) 的颜色。

public RvAdapter(Context context,List<Person> persons) {
    this.mContext=context;
    this.persons=persons;
}

 @Override
 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.card_view_content,parent,false);
    ViewHolder vh=new ViewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
    final ViewHolder mHolder=holder;
    mHolder.personName.setText(persons.get(position).name);
    mHolder.personAge.setText(( persons.get(position).age));

    mHolder.cvCard.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(mContext,"card number:"+String.valueOf(position),Toast.LENGTH_SHORT).show();
        }
    });

    //this is where the error comes
    mHolder.alarmImageButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //this code line doesnt work
            //mHolder.alarmImageButton.setColorFilter(R.color.colorAccent);

           //this code line works... but it changes the imagebutton color of another card view at below of the recycler view 
           mHolder.alarmImageButton.setColorFilter(Color.argb(255,255,255,255)); 
           Toast.makeText(mContext,"button:"+String.valueOf(position),Toast.LENGTH_SHORT).show();
        }
    });
}

RecyclerView 里面有 8 个卡片视图。当第一个cardview的imagebutton的imagebutton被点击时,颜色变为白色。但错误是它也改变了第 7 张卡片的图像按钮颜色的颜色。当第二张卡片视图的图像按钮被点击时,它也会改变第八张卡片的图像按钮颜色。但是,吐司工作正常。它表明点击事件已经正确识别了每个cardview和imagebutton的位置。

我只是无法正确解决这个问题。第一张牌第七张牌的观点是如何相互联系的?

这是我的 ViewHolder 类

public class ViewHolder extends RecyclerView.ViewHolder{
    CardView cvCard;
    TextView personName;
    TextView personAge;
    ImageButton alarmImageButton;
    public ViewHolder(View itemView) {
        super(itemView);
        cvCard=(CardView)itemView.findViewById(R.id.cv_card);
        personName=(TextView)itemView.findViewById(R.id.txt_person_name);
        personAge=(TextView)itemView.findViewById(R.id.txt_person_age);
        alarmImageButton=(ImageButton)itemView.findViewById(R.id.alarm_image_button);
}

如果有人能帮我找到这个错误,那将是一个很大的帮助......

【问题讨论】:

    标签: android onclicklistener android-recyclerview


    【解决方案1】:

    我只是无法正确解决这个问题。第1张牌第7张牌怎么打 视图是否相互关联?

    使用RecyclerView 的意义在于Views 正在被回收。 您设置了ImageButton 的颜色过滤器,但同样的按钮也可以在回收的View 中使用。

    您应该存储RecyclerView 行的点击状态,并在onBindViewHolder() 中的每个ImageButton 上相应地设置颜色过滤器。

    例如:

    // a HashSet to store the clicked positions
    private HashSet<Integer> clickedPositions = new HashSet<>();
    
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        final ViewHolder mHolder = holder;
        mHolder.personName.setText(persons.get(position).name);
        mHolder.personAge.setText((persons.get(position).age));
    
        mHolder.cvCard.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(mContext, "card number:" + String.valueOf(position),
                        Toast.LENGTH_SHORT).show();
            }
        });
    
        if (clickedPositions.contains(mHolder.getAdapterPosition())) {
            // the current item is clicked, change its color
            mHolder.alarmImageButton.setColorFilter(Color.argb(255, 255, 255, 255));
        } else {
            // else change it to another color
            mHolder.alarmImageButton.setColorFilter(Color.argb(0, 0, 0, 0));
        }
    
        mHolder.alarmImageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(mContext, "button:" + String.valueOf(position),
                        Toast.LENGTH_SHORT).show();
    
                // if the item is already clicked, remove it from the clicked items
                if (!clickedPositions.remove(mHolder.getAdapterPosition())) {
                    // if not clicked, add it to the clicked items
                    clickedPositions.add(mHolder.getAdapterPosition());
                }
                // and notify the Adapter that the item is changed
                notifyItemChanged(mHolder.getAdapterPosition());
            }
        });
    }
    

    【讨论】:

      【解决方案2】:

      将 id 存储在稀疏布尔数组中。如果颜色改变,则存储 true 否则为 false。

      将这些方法添加到您的适配器。

      private SparseBooleanArray mSelectedItemsIds;
      
      //Methods to do Selection
      
          public void toggleSelection(int position) {
              selectView(position, !mSelectedItemsIds.get(position));
          }
      
      
          //Remove selected selections
          public void removeSelection() {
              mSelectedItemsIds = new SparseBooleanArray();
              notifyDataSetChanged();
          }
      
      
          //Put or delete selected position into SparseBooleanArray
          public void selectView(int position, boolean value) {
              if (value)
                  mSelectedItemsIds.put(position, value);
              else
                  mSelectedItemsIds.delete(position);
      
              // notifyItemChangedAtPosition(position);
              notifyDataSetChanged();
          }

      然后在需要时调用它。

      【讨论】:

      • 给我一些时间来检查这个答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多