1

私はいくつかのカードビューを表示するrecyclerviewを持っています。各カードビューには、テキスト、イメージボタンなどの要素がいくつかあります。 Adapterクラス(RvAdapterはRecyclerView.Adapterを継承しています)内には、以下のコードがあります。私がしたいのは、同じボタンのOnClickListenerを使用してimagebuttonに割り当てられたVector(.xml)の色を変更することです。RecyclerViewでImageButtonに割り当てられたベクトルの色を変更するにはどうすればいいですか?

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 cardviewsを持っています。最初のカードビューのイメージボタンのイメージボタンがクリックされると、色が白に変わります。しかし、エラーは、それも7番目のカードのイメージボタンの色の色を変更することです。 2枚目のカードビューの画像ボタンをクリックすると、8枚目のカードの画像ボタンの色も変わります。しかし、トーストはうまく動作します。 clickイベントが各cardviewとimagebuttonの位置を適切に識別していることを示しています。

私はこれを正しく理解できませんでした。 1枚目のカードの7枚目のカードビューはどうつながっていますか?

これは、私はちょうどこれを適切に把握することができませんでし

答えて

2

...誰かがこのエラーを見つけるために私を助けることができる場合、それは大きな助けになります私の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); 
} 

です。どのように1枚目のカード第7カード の意見は繋がっていますか?

RecyclerViewを使用している点は、Viewがリサイクルされていることです。 ImageButtonのcolorFilterを設定しましたが、同じボタンをリサイクルされたViewでも使用できます。

RecyclerView行のクリックした状態を保存して、の各ImageButtonにcolorFilterを設定する必要があります。例えば

:sparsebooleanarrayで

// 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()); 
     } 
    }); 
} 
0

ストアの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(); 
 
    }

その後、としてそれを呼び出し、必要なとき。

+0

この回答を確認する時間をください。 –

関連する問題