Cardview в RecyclerView выбирает несколько карт, а не только одну - PullRequest
0 голосов
/ 05 февраля 2019

Я создаю простое приложение для Android, где cardview создается и вставляется через recycleview.Я добавил возможность выбирать каждую отдельную карточку, которая меняет цвет текста и делает его видимым на карточке.Проблема в том, что при нажатии на первую карту, эффект выбора также добавляется к последней карте, как если бы была ошибка для подсчета или что-то еще.Практически первая и последняя карты связаны, как если бы они были одинаковыми, как показано на следующих изображениях:

[1]: https://imgur.com/a/PndmbHf

[2]: https://imgur.com/a/0epn5p8

Я не нашел подобной проблемы, но в прошлом я уже сталкивался с такими проблемами во взаимодействии с cardview.Вот мой адаптер с кодом, который делает это:

public class AllMovesListAdapter extends RecyclerView.Adapter<AllMovesListAdapter.UserViewHolder> {
private static CardView card;
private List<moveListActivity.move_card> moveList;
private static Context context;
int[] counter;

public AllMovesListAdapter(List<moveListActivity.move_card> biglList, Context context) {
    this.moveList = biglList;
    this.context = context;
}

@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.move_card, null);
    UserViewHolder userViewHolder = new UserViewHolder(view);
    counter = new int[getItemCount()];
    return userViewHolder;
}

@Override
public void onBindViewHolder(final UserViewHolder holder, int position) {
    moveListActivity.move_card mcard = moveList.get(position);
    holder.tvName.setText(mcard.getName());
    holder.tvDescr.setText(mcard.getDescr());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = holder.getAdapterPosition();
            if (position!=RecyclerView.NO_POSITION){
                if (counter[position]==0){
                    holder.ivTr.setVisibility(View.VISIBLE);
                    holder.tvName.setTextColor(ContextCompat.getColor(context, R.color.green));
                    holder.tvDescr.setTextColor(ContextCompat.getColor(context, R.color.green));
                    counter[position]=1;
                }else{
                    holder.ivTr.setVisibility(View.GONE);
                    holder.tvName.setTextColor(ContextCompat.getColor(context, R.color.white));
                    holder.tvDescr.setTextColor(ContextCompat.getColor(context, R.color.white));
                    counter[position]=0;
                }
                Snackbar.make(v, "Click detected on item " + position + "| counter: " + counter[position],
                        Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }

        }
    });
}

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

public static class UserViewHolder extends RecyclerView.ViewHolder {
    ImageView ivMove, ivTr;
    TextView tvName;
    TextView tvDescr;

    public UserViewHolder(View itemView) {
        super(itemView);
        ivTr = (ImageView) itemView.findViewById(R.id.ivTr);
        ivMove = (ImageView) itemView.findViewById(R.id.ivMove);
        tvName = (TextView) itemView.findViewById(R.id.tvName);
        tvDescr = (TextView) itemView.findViewById(R.id.tvDescr);

    }
}
}

Кто-нибудь знает, от чего зависит эта проблема?Я просто хотел бы реализовать множественный выбор списка карт с помощью этого метода.(Я не уверен, что в будущем я буду иметь дело с несколькими просмотрами карт, поэтому я хотел бы использовать просмотр утилизации вместо создания отдельных карт в файле .xml.

РЕДАКТИРОВАТЬ: Обновлен код в соответствии с рекомендациями leojg. Переместите управление событиями onClick в onBindViewHolder. Но проблема остается прежней.

1 Ответ

0 голосов
/ 05 февраля 2019

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

Вы должны переместить логику onclick на onBindViewHolder()

...