2016-12-02 60 views
2

RecyclerViewアイテムのクリック時にRecyclerView CardViewの背景色(緑色)を変更しようとしています。RecyclerViewの次のアイテムをクリックしたときに前のアイテムを変更/元の色(ピンク色)になり、選択された項目の色が緑に変わります。誰かが私にこのための適切な解決策を与えることができます。RecyclerView Cardviewアイテムの背景色の変更

Plss see image

私のクラス - :

public class RecylerAdapter extends RecyclerView.Adapter<RecylerAdapter.ViewHolder> 
{ private boolean isSelected; 
    private final static int FADE_DURATION = 500;// milliseconds 
    private int lastPosition = -1; 
    Context cont; 
    private String[] strname; 
    private int[] icon; 
    public RecylerAdapter(Context con, String[] androidNames, int[] androidIcon) 
    { cont=con; 
     strname=androidNames; 
     icon=androidIcon; 
    } 
    class ViewHolder extends RecyclerView.ViewHolder 
    { private ImageView imgView; 
     private TextView txtView; 
     private CardView cardView; 
     private SparseBooleanArray selectedItems = new SparseBooleanArray(); 

     public ViewHolder(final View itemView) 
     { 
      super(itemView); 

      imgView = (ImageView) itemView.findViewById(R.id.imageView); 
      txtView = (TextView) itemView.findViewById(R.id.txt); 
      cardView = (CardView) itemView.findViewById(R.id.cv12); 


      itemView.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View v) 
       { 
        cardView.isSelected = !cardView.isSelected; 
        notifyDataSetChanged(); 
       } 
      }); 
     } 
    } 
    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_layout,parent,false); 
     ViewHolder viewHolder = new ViewHolder(v); 

     return viewHolder; 
    } 

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int i) 
    { 
     if(ViewHolder.isSelected) 
     { 
      holder.cardView.setBackground(Color.Green); 
     } 
     else{ 
      holder.cardView.setBackground(Color.Pink); 
     } 
     holder.txtView.setText(strname[i]); 
     holder.imgView.setImageResource(icon[i]); 
     setAnimation(holder.cardView, i); 
    } 
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
    private void setAnimation(View viewToAnimate, int position) 
    { 
     // If the bound view wasn't previously displayed on screen, it's animated 
     if (position > lastPosition) 
     { 
      //animation 1 
      AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); 
      anim.setDuration(FADE_DURATION); 
      viewToAnimate.startAnimation(anim); 

      //animation 2 
      Animation animation = AnimationUtils.loadAnimation(cont, android.R.anim.slide_in_left); 
      viewToAnimate.startAnimation(animation); 
      lastPosition = position; 
     } 
     else 
     { 
      Animation animation = AnimationUtils.loadAnimation(cont, android.R.anim.slide_in_left); 
      viewToAnimate.startAnimation(animation); 
      lastPosition = position; 
     } 
    } 
    @Override 
    public int getItemCount() 
    { 
     return strname.length; 
    } 
    public void setSelected(boolean selection){ 
     this.isSelected = selection; 
    } 
    public boolean isSelected(){ 
     return isSelected; 
    } 
} 
+1

はブールまたはは、colorName、およびonclickの項目リスナーチェンジカラー値のようなあなたのモデルクラス内の別のフィールドを追加するバインドビューホルダーでRecyclerView.ViewHolder {

public TextView textView; public ImageView imageView; public ImageView lineImageView; public MyView(View view) { super(view); textView = (TextView) view.findViewById(R.id.name); imageView = (ImageView) view.findViewById(R.id.food_category_img); lineImageView = (ImageView) view.findViewById(R.id.line); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { for(int i=0; i<mDataset.size();i++) { mDataset.get(i).setSelected(false); } mDataset.get(getAdapterPosition()).setSelected(true); notifyDataSetChanged(); } }); } } 

を拡張しますそのアイテムの –

+0

@Divyesh .. 'if(selectedItems.get(getAdapterPosition()、false)){ selectedItems.delete(getAdapterPosition()); cardView.setCardBackgroundColor(Color.GREEN); } else { selectedItems.put(getAdapterPosition()、true); cardView.setCardBackgroundColor(Color.BLUE); } } 'この論理を試しました –

+0

このためには、リストのModelクラスでもう1つブール値を管理する必要があります。下記のreadyandroidの答えを確認してください。 –

答えて

4

それはすべてあなたの項目の選択についてのモデルクラスを使用して管理しています:

MyModel.class: をこれはあなたのクラスでありますリサイクラービューにデータのリストを表示するために使用しています。ブール変数を追加して選択と選択解除を行います。あなたのアダプタでのリサイクルビューの項目をクリックしたときに、今

private boolean isSelected; 

public void setSelected(boolean selection){ 
this.isSelected = selection; 
} 

public boolean isSelected(){ 
return isSelected; 
} 

:あなたが見つかった場合

myModel = list.get(position); 
myModel.isSelected = !myModel.isSelected; 
notifyDataSetChanged(); 
アダプタ

myModel = list.get(position); 
    if(myModel.isSelected){ 
     itemView.setBackground(Color.Green); 
    }else{ 
     itemView.setBackground(Color.Pink); 
    } 

使用このロジックのonBindViewHolder方法で

と確認し、任意の難易度は、私を聞かせて知っている。あなたは以下で確認し、モデル変数選択を管理することはできませんので、あなたはモデルクラスのリストを使用していないよう

あなたの更新されたコード:

public class RecylerAdapter extends RecyclerView.Adapter<RecylerAdapter.ViewHolder> { 
    private boolean isSelected; 
    private final static int FADE_DURATION = 500;// milliseconds 
    private int lastPosition = -1; 
    Context cont; 
    private String[] strname; 
    private int[] icon; 
    private int selectedPosition = -1; 

    public RecylerAdapter(Context con, String[] androidNames, int[] androidIcon) { 
     cont = con; 
     strname = androidNames; 
     icon = androidIcon; 
    } 

    class ViewHolder extends RecyclerView.ViewHolder { 
     private ImageView imgView; 
     private TextView txtView; 
     private CardView cardView; 
     private SparseBooleanArray selectedItems = new SparseBooleanArray(); 

     public ViewHolder(final View itemView) { 
      super(itemView); 
      imgView = (ImageView) itemView.findViewById(R.id.imageView); 
      txtView = (TextView) itemView.findViewById(R.id.txt); 
      cardView = (CardView) itemView.findViewById(R.id.cv12); 

      itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        selectedPosition = getAdapterPosition(); 
        notifyDataSetChanged(); 
       } 
      }); 
     } 
    } 

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

     return viewHolder; 
    } 

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int i) { 
     if (selectedPosition == i) { 
      holder.cardView.setBackground(Color.Green); 
     } else { 
      holder.cardView.setBackground(Color.Pink); 
     } 
     holder.txtView.setText(strname[i]); 
     holder.imgView.setImageResource(icon[i]); 
     setAnimation(holder.cardView, i); 
    } 

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
    private void setAnimation(View viewToAnimate, int position) { 
     // If the bound view wasn't previously displayed on screen, it's animated 
     if (position > lastPosition) { 
      //animation 1 
      AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); 
      anim.setDuration(FADE_DURATION); 
      viewToAnimate.startAnimation(anim); 

      //animation 2 
      Animation animation = AnimationUtils.loadAnimation(cont, android.R.anim.slide_in_left); 
      viewToAnimate.startAnimation(animation); 
      lastPosition = position; 
     } else { 
      Animation animation = AnimationUtils.loadAnimation(cont, android.R.anim.slide_in_left); 
      viewToAnimate.startAnimation(animation); 
      lastPosition = position; 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return strname.length; 
    } 
} 
+0

親愛なる@Ready AndroidはitemViewの代わりにcardViewを使うことができます。 –

+0

はい、これはあなたのカードビューまたはあなたが使用しているもので、私はそれをitemViewと言いました。 –

+0

Sah Rahul Dhanuka、あなたの個人IDに私のコードを送ってもらえますか? –

0

をお使いのアダプタクラスでは、これを行います。

パブリッククラスMYVIEWはこの

if(mDataset.get(position).isSelected()){ 
     itemView.Background(set color) 
    }else{ 
     itemView.Background(set color) 
    } 
関連する問題