0

У меня есть список отраслей, установленных в адаптере. Каждый раз, когда я нажимаю/выбираю отрасль, меняются имя и цвет фона. Но когда я пытаюсь ниже код, предыдущая выбранная промышленность не изменится его цвет по умолчаниюУдалить последнее выбранное положение OnClick в Recycler View adapter

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    holder.setIsRecyclable(false); 
    holder.txtIndustry.setText(industries.get(position).getIndustryName().trim()); 
    holder.txtIndustry.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      selectedPosition = holder.getAdapterPosition(); 
      // Highlight the background and change the text color. 
      if (selectedPosition == position) { 
       holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.text_color_blue)); 
       holder.txtIndustry.setTextColor(Color.WHITE); 
      } else { 
       holder.itemView.setBackgroundColor(Color.TRANSPARENT); 
       holder.txtIndustry.setTextColor(context.getResources().getColor(R.color.text_color_blue)); 
      } 
      notifyItemChanged(selectedPosition); 
      callback.selectedIndustryPosition(position); 
     } 
    }); 
} 

Решения для вышеуказанной задачи:

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    industry = industries.get(position); 
    holder.setIsRecyclable(false); 
    holder.txtIndustry.setText(industry.getIndustryName().trim()); 

    if (holder.getAdapterPosition() == selectedPosition) { 
     // Highlight the background and change the text color. 
     holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.text_color_blue)); 
     holder.txtIndustry.setTextColor(Color.WHITE); 
    } else { 
     holder.itemView.setBackgroundColor(Color.TRANSPARENT); 
     holder.txtIndustry.setTextColor(context.getResources().getColor(R.color.text_color_blue)); 
    } 

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

ответ

0

обновления код этого он будет работать:

@Override 
    public void onBindViewHolder(final ViewHolder holder, final int position) { 
     holder.setIsRecyclable(false); 
     if (selectedPosition != -1) { 
      if (selectedPosition == position) { 
       holder.itemView.setBackgroundColor(context.getResources() 
         .getColor(R.color.text_color_blue)); 
       holder.txtIndustry.setTextColor(Color.WHITE); 
      } else { 
       holder.itemView.setBackgroundColor(Color.TRANSPARENT); 
       holder.txtIndustry.setTextColor(context.getResources() 
         .getColor(R.color.text_color_blue)); 
      } 
     } 
     holder.txtIndustry.setText(industries.get(position).getIndustryName() 
       .trim()); 
     holder.txtIndustry.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       selectedPosition = holder.getAdapterPosition(); 
       // Highlight the background and change the text color. 
       notifyItemChanged(selectedPosition); 
       callback.selectedIndustryPosition(position); 
      } 
     }); 
    } 

Как только вы нажмете, вы нажмете на кнопку. Как только клик будет завершен, ваш код адаптера будет вызываться там, где вы не написали код, чтобы изменить цвет. Сначала определите selectedPosition до -1, поэтому, когда вы загружаете свой список в первый раз, он отображает насыщенный цвет фона.

+0

Ваш код не работает. Он выбирает все виды –

+0

, если вы инициализировали selectedPosition = -1 вместе с другой переменной вашего адаптера? – Anjali

+0

Да, int selectedPosition = -1 –

0

Что происходит, так это то, что ваш код ТОЛЬКО ИЗМЕНЕНИЯ макет по умолчанию выбранному. Вы никогда не возвращаете макет обратно по умолчанию. Посмотрите на код ниже:

На вашем слушателе вы можете сбросить все видимые предметы.

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    holder.setIsRecyclable(false); 
    holder.txtIndustry.setText(industries.get(position).getIndustryName().trim()); 
    holder.txtIndustry.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      selectedPosition = holder.getAdapterPosition(); 
      // Highlight the background and change the text color. 
      if (selectedPosition == position) { 
       holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.text_color_blue)); 
       holder.txtIndustry.setTextColor(Color.WHITE); 
      } else { 
       holder.itemView.setBackgroundColor(Color.TRANSPARENT); 
       holder.txtIndustry.setTextColor(context.getResources().getColor(R.color.text_color_blue)); 
      } 
      notifyItemChanged(selectedPosition); 
      callback.selectedIndustryPosition(position); 

      LinearLayoutManager layoutManager = ((LinearLayoutManager) mRecyclerView.getLayoutManager()); 
      int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 
      int lastVisiblePosition = layoutManager.findLastVisibleItemPosition(); 

      for (int i = firstVisiblePosition; i <= lastVisiblePosition; i++) { 
       resetLayoutForPosition(i); 
      } 
     } 
    }); 
    resetLayoutForPosition(position); 
} 

И вы создаете метод resetLayoutForPosition где вы установили цвет как случае по умолчанию.

1

Проблема в том, что onClick находится внутри каждого держателя. Я имею в виду, что каждая строка имеет свой собственный onClick. Если вы нажмете на строку 2, вы будете только ТОЛЬКО этому держателю.

Одним из решений может быть ссылка на последний модифицированный держатель.

private ViewHolder lastModifiedHoled = null; 

@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    holder.setIsRecyclable(false); 
    holder.txtIndustry.setText(industries.get(position).getIndustryName().trim()); 
    holder.txtIndustry.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      selectedPosition = holder.getAdapterPosition(); 

      // Reset last modified 
      if (lastModifiedHoled != null) { 
       int lastPosition = lastModifiedHoled.getAdapterPosition(); 
       lastModifiedHoled.itemView.setBackgroundColor(Color.TRANSPARENT); 
       lastModifiedHoled.txtIndustry.setTextColor(context.getResources().getColor(R.color.text_color_blue)); 
       notifyItemChanged(lastPosition); 
      } 

      // Highlight the background and change the text color. 
      holder.itemView.setBackgroundColor(context.getResources().getColor(R.color.text_color_blue)); 
      holder.txtIndustry.setTextColor(Color.WHITE); 
      notifyItemChanged(selectedPosition); 

      lastModifiedHoled = holder; 

      callback.selectedIndustryPosition(position); 
     } 
    }); 
} 
+0

Ваш код будет перекрывать данные при прокрутке списка. –

+0

Ops, вы правы. Но в этом случае держатель НЕ подлежит вторичной переработке. Не только в моем коде, но и в вопросе. – adalPaRi

Смежные вопросы