2016-12-02 3 views
2

Я пытаюсь изменить цвет (зеленый) фона RecViewerView CardView при нажатии на элемент RecylerView, когда я нажимаю на следующий элемент RecyclerView, тогда предыдущий элемент должен быть изменен/доходит до его первоначального цвета (розовый), а выбранный цвет элемента будет изменен, то есть зеленый. Может ли кто-нибудь дать мне правильное решение для этого.Изменение цвета фона элемента обзора RetyclerView при щелчке по его элементу

Plss see image

Мои 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

добавить еще одно поле в классе модели, как логическое или ColorName и OnClick элемент слушателя значение изменения цвета этого элемента –

+0

@Divyesh .. 'if (selectedItems.get (getAdapterPosition(), false)) { selectedItems.delete (getAdapterPosition()); cardView.setCardBackgroundColor (Color.GREEN); } else { selectedItems.put (getAdapterPosition(), true); cardView.setCardBackgroundColor (Color.BLUE); } } 'Я пробовал эту логику –

+0

Для этого вам нужно управлять еще одним булевым в классе модели List. Проверьте answerandroid ответ ниже. –

ответ

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(); 

В методе onBindViewHolder адаптера

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

Используйте эту логику и проверить, если вы нашли какие-либо трудности, дайте мне знать.

Вашего обновленный код, как вы не используете список моделей класса, так что вы не можете управлять с моделью переменным выбором, проверьте с ниже:

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, я могу использовать cardView вместо itemView. –

+0

Да, это ваш вид карты или все, что вы используете, для справки Я сказал, что itemView. –

+0

Сэр Рахул Данука, могу ли я отправить вам свой код на ваш личный идентификатор? –

0

В классе адаптера это сделать.

общественного класса MyView расширяет 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(); 
      } 
     }); 
    } 
} 

В Bind держатель вид делают это

if(mDataset.get(position).isSelected()){ 
     itemView.Background(set color) 
    }else{ 
     itemView.Background(set color) 
    } 
Смежные вопросы