Как отслеживать выбранные элементы в RecyclerView в Android?
как добиться согласованного выбора элемента с RecyclerView
? Я понял всю идею RecyclerView
переработка старых представлений, а что нет. Моя проблема в том, что у меня есть список элементов со значком на каждом элементе, когда элемент нажат, значок меняет цвет. Мне удалось достичь всего этого, но я просто понял, когда я прокручиваю список, что другие элементы также изменили свои значки, и когда я прокручиваю назад к элементу, на который я нажал, значок больше не находится в "нажатом цвете".
кто-нибудь знает как отслеживать выбранные объекты? Я все время вижу что-то под названием SparseBooleanArray
, но я не уверен, как это реализовать.
вот мой адаптер код:
public class TableRVAdapter extends RecyclerView.Adapter<TableRVAdapter.TableHolder> {
List<Tables> tableList;
private SparseBooleanArray selectedItems;
public TableRVAdapter(List<Tables> tableList)
{
this.tableList = tableList;
selectedItems = new SparseBooleanArray();
// setHasStableIds(true);
}
class TableHolder extends RecyclerView.ViewHolder
{
TextView tableTV;
CardView tableCV;
View circle;
View parentView;
TableHolder(final View itemView)
{
super(itemView);
tableTV = (TextView)itemView.findViewById(R.id.tableTV);
tableCV = (CardView)itemView.findViewById(R.id.tableCV);
circle = itemView.findViewById(R.id.statusCircle);
itemView.setClickable(true);
parentView = itemView;
tableCV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
circle.setBackgroundResource(R.drawable.circle);
}
});
}
/*
@Override
public void onClick(View view) {
if (selectedItems.get(getAdapterPosition(), false)) {
tableCV.setSelected(false);
circle.setBackgroundResource(R.drawable.circle2);
}
else {
selectedItems.put(getAdapterPosition(), true);
tableCV.setSelected(true);
circle.setBackgroundResource(R.drawable.circle);
}
}*/
}
@Override
public TableHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.table_item,parent,false);
TableHolder tableHolder = new TableHolder(view);
return tableHolder;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView)
{
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onBindViewHolder(TableHolder holder, int position) {
holder.tableTV.setText(tableList.get(position).getTableNumber());
}
/**
* Returns the total number of items in the data set hold by the adapter.
*
* @return The total number of items in this adapter.
*/
@Override
public int getItemCount() {
return tableList.size();
}
}
3 ответов
RecyclerView.адаптер имеет 2 важные функции для переопределения:
onCreateViewHolder(parent, viewType)
onBindVIewHolder(viewholder, position)
первая функция используется для раздувания представлений, которые будут использоваться внутри recyclerview, вторая используется для привязки данных, которые у вас есть к этому представлению, и, таким образом, установить правильное viewstate на представление.
сам recyclerview будет только раздувать определенное количество представлений, а затем начнет повторно использовать уже раздутые представления (следовательно, recyclerview). Поэтому вам нужно установить правильное состояние для каждый элемент в onBindViewholder () и использовать элемент в вашей коллекции на этой позиции, чтобы установить правильное viewState. Для вашего примера: измените цвет значка, в зависимости от логического значения в ваших объектах, например: isPressed
Я знаю, что на этот вопрос уже ответили, но кто-то может найти этот ответ полезным и проще.
есть один полезный метод в представлении recycler -onViewRecycled
.
Это может помочь вам уйти от нажатого состояния. При работе с изображениями / drawables в представлении recylcer, когда некоторые из элементов не используют drawables, previews recycler view's drawn image будет присутствовать, и это заставляет выглядеть все данные неправильно, как это произошло с вами с вашим выбранное представление.
чтобы достичь этого более простым способом, вы можете использовать этот метод для очистки нарисованных изображений для сброса его значений.
например, вы отмечаете фон выбранного элемента зеленым цветом, а некоторые из ваших представлений содержат изображения(Примечание: только некоторые элементов), чем использовать этот метод, как это:
@Override
public void onViewRecycled(MyViewHolder holder) {
super.onViewRecycled(holder);
// Set ImageView's Drawable as transperent
holder.myImageView.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent));
// Set background color as transperent
holder.bgContainer.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), android.R.color.transparent));
}
и теперь вы можете управлять ArrayList
целых чисел с идентификаторами / положением выбранных элементов (с помощью onClick метод на элементе представления recycler).
С onBindViewHolder(MyViewHolder myViewHolder, int position)
обычно вы можете заполнить данные. И для установки фона вы можете просто проверить, находится ли id / position в ArrayList
или нет (если правда, установить цвет фона зеленый else оставьте как есть. Поскольку он будет управляться методом onViewRecylcer и не повлияет на другие прокручиваемые элементы с зеленым фоном, даже если он не выбран).
надеюсь, что это поможет кому-то и сделает вид recyler с выбор немного проще.
вы должны сохранить экземпляр такой
if (isPressed) {
icon.setCustomIcon();
} else {
icon.setDefaultIcon();
}
если у вас есть пользовательский объект иметь логическое isPressed или что-то подобное, это должно работать