0

Я создал адаптер и ViewHolder для recyclerView. Я связываю imageButton элемента itemView внутри Viewholder. И установили onClickListener внутри onBindViewHolder.Сохранение состояния элемента, выбранного в RecyclerView при повторном использовании представления при прокрутке

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

Вот некоторый код

public class ListViewHolder extends RecyclerView.ViewHolder { 
    TextView textViewUserName; 
    ImageButton imageButtonCheckMark; 

    public ListViewHolder(View itemView) { 
     super(itemView); 
     textViewUserName = (TextView) itemView.findViewById(R.id.textView_user_name); 
     imageButtonCheckMark = (ImageButton) itemView.findViewById(R.id.imageButton_add_user); 
    } 
} 

класс Adapter

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ListViewHolder> { 

    private LayoutInflater inflater; 
    private Context context; 
    private List<Metadata> list; 
    public static boolean isUserSelected = false; 
    ListInterface listener; 

    public ListAdapter(Context context, List<Metadata> data, ListInterface listener) { 
     Log.d(TAG, "Passed list to adapter : " + data.size()); 
     inflater = LayoutInflater.from(context); 
     this.context = context; 
     this.list = data; 
     this.listener = listener; 
    } 

    @Override 
    public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.item_following_people, parent, false); 
     return new ListViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ListViewHolder holder, int position) { 

     holder.textViewUserName.setText(list.get(position).name); 

     holder.imageButtonCheckMark.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (!isUserSelected) { 
        holder.imageButtonCheckMark.setImageResource(R.drawable.checkmark_green); 
        isUserSelected = true; 
       } else { 
        holder.imageButtonCheckMark.setImageResource(R.drawable.checkmark_grey); 
        isUserSelected = false; 
       } 
       listener.onUserSelected(isUserSelected, holder.getLayoutPosition()); 
      } 
     }); 
    } 


    @Override 
    public int getItemCount() { 
     return list.size(); 
    } 
} 

Inteface класс

public interface ListInterface { 
    public void onUserSelected(boolean userStatus, int listPosition); 
} 

интерфейса обратного вызова слушателя внутри активности

// Interface callback listener implemented in the activity class 
private ArrayList<Metadata> metadataList = new ArrayList<>(); 
ArrayList<String> selectedUserIdList = new ArrayList<>(); 

@Override 
public void onUserSelected(boolean isUserSelected, int pos) { 
    if (isUserSelected) { 
     Log.d(TAG, "Selected user Id: " + metadataList.get(pos).userID); 
     followersSelectedIdList.add(metadataList.get(pos).userID); 
    } else { 
     Log.d(TAG, "Removed user Id: " + metadataList.get(pos).userID); 
     followersSelectedIdList.remove(metadataList.get(pos).userID); 
    } 
} 

ответ

1

Вы видите это поведение, поскольку просмотры повторно используются (перерабатываются) при прокрутке. Вам нужно сохранить состояние для всех кнопок в списке и установить состояние каждой кнопки в onBindViewHolder(), когда оно станет видимым.

+0

Я знаю о повторном использовании itemViews в recyclerView. Можете ли вы поделиться идеей о том, как сохранить состояние и установить состояния кнопки. Любой фрагмент статьи/кода будет действительно полезен. Я пробовал различное решение в SO для создания глобальной переменной и т. Д., Но ничего не работает. Я также нашел 2 библиотеки, но они предназначены для более сложных функций, и я не хочу добавлять зависимые от сторонних сторон для этой простой проблемы. –

+0

@ gaurav4sarma вы уже дали код для установки состояния кнопки. Проблема в том, что у вас есть только одна логическая переменная для всего списка, если вам нужна одна для каждой кнопки. A List сделает работу красиво. –

+0

Прошу прощения, но я не в состоянии выполнить его правильно. Вы можете отредактировать свой ответ и направить меня как правильно его реализовать? –

1

Добавьте один атрибут в модели классе, который будет сохранять состояние, как выбрана или не ваша кнопка, писать код в onBindViewHolder() для управления видом кнопки, как это,

if(yourModel.getIsSelected()){ 
    // positive view 
} else { 
    //negative view 
} 
Смежные вопросы