2016-12-02 5 views
2

Ich versuche, die Farbe (Grün) von RecyclerView CardView Hintergrund zu ändern, wenn auf RecylerView Element klickt, wenn ich auf das nächste Element von RecyclerView klicken, dann muss der vorherige Artikel geändert werden/kommt zu seiner ursprünglichen Farbe (Pink), und ausgewählte Elementfarbe wäre Änderung, das heißt Grün. Kann mir jemand die passende Lösung dafür geben?RecyclerView Cardview Artikel Hintergrundfarbe ändern, wenn auf sein Element klicken

Plss see image

Mein Class-:

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

ein anderes Feld in der Modellklasse hinzufügen wie boolean oder colorname, und Onclick Artikel Hörer ändern Farbwert dieses Elements –

+0

@Divyesh .. 'if (selectedItems.get (getAdapterPosition(), false)) { selectedItems.delete (getAdapterPosition()); cardView.setCardBackgroundColor (Color.GREEN); } else { selectedItems.put (getAdapterPosition(), true); cardView.setCardBackgroundColor (Color.BLUE); } } 'Ich habe versucht, diese Logik –

+0

Dafür müssen Sie eine weitere boolean in Ihrer Model-Klasse von List verwalten. Überprüfen Sie die Antwort von readyandroid unten. –

Antwort

4

Es geht um Ihre Artikelauswahl manage Modellklasse mit:

MyModel.class: Dies ist die Klasse, die Sie verwenden, um die Datenliste der Recycler-Ansicht zu zeigen. Fügen Sie eine boolesche Variable hinzu, um Auswahl und Abwahl zu treffen.

private boolean isSelected; 

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

public boolean isSelected(){ 
return isSelected; 
} 

Jetzt auf Artikel klicken Recycler Ansicht in Ihrem Adapter:

myModel = list.get(position); 
myModel.isSelected = !myModel.isSelected; 
notifyDataSetChanged(); 

In onBindViewHolder Methode des Adapters

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

Mit dieser Logik und prüfen Sie, ob Sie Schwierigkeiten gefunden lassen Sie mich kennt.

Ihr aktualisierten Code, wie Sie nicht Liste der Modellklasse verwenden, so dass Sie nicht mit dem Modell variable Auswahl verwalten können, wenden Sie sich an unter:

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

Sehr geehrte @ Ready Android kann ich cardView anstelle von itemView verwenden. –

+0

Ja das ist Ihre Kartenansicht oder was auch immer Sie verwenden, als Referenz habe ich itemView gesagt. –

+0

Sir Rahul Dhanuka, kann ich Ihnen meinen Code für Ihre persönliche ID schicken? –

0

In Ihrer Adapter Klasse tun.

public class MyView erweitert 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(); 
      } 
     }); 
    } 
} 

In Bind Ansicht Halter tun dies

if(mDataset.get(position).isSelected()){ 
     itemView.Background(set color) 
    }else{ 
     itemView.Background(set color) 
    } 
Verwandte Themen