Android проходит через все элементы RecyclerView - PullRequest
0 голосов
/ 08 мая 2019

У меня есть приложение RecyclerView в моем приложении, элемент списка, который я показываю, это просто TextView внутри CardView , когда я нажимаю на любой отображаемый TextView, это будет мой выбранный элемент, я будуработа с более поздними.
Идея в том, что если я щелкну по любому из них, CardView, который его держит, должен изменить bgcolor, например, на акцент цвета.

Проблема в том, что, как только я изменяю один из bgcolor карты, тогда я не знаю, как мне это сделать, когда я нажимаю на любой другой TextView из RecyclerView.
Код, который я 'я работаю с:

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    holder.name.setText(mNames.get(position));

    int favIndex = copyDatas.get(position).fieldNames.indexOf("fav");
    boolean fav = (boolean) copyDatas.get(position).values.get(favIndex);
    if (fav) {
        holder.fav.setVisibility(View.VISIBLE);
        holder.notfav.setVisibility(View.GONE);
    } else {
        holder.notfav.setVisibility(View.VISIBLE);
        holder.fav.setVisibility(View.GONE);
    }

    holder.name.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(mContext, "Choosen: " + mNames.get(position), Toast.LENGTH_SHORT).show();
            String entity_name = mNames.get(position);                
            holder.cardView.setCardBackgroundColor(mContext.getColor(R.color.colorAccent));

        }
    });       
}

Итак, в основном я хочу сделать следующее: когда я нажимаю на них (holder.name.setOnClickListener ...), он должен пройти по каждому элементу RecyclerView и сбросить их bgcolor наосновной цвет

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Вам нужно запомнить, какая позиция выбрана. Тогда оттуда вы можете условно изменить фон в onBindViewHolder

int selectedPosition = 0;

    @Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    holder.name.setText(mNames.get(position));

    int favIndex = copyDatas.get(position).fieldNames.indexOf("fav");
    boolean fav = (boolean) copyDatas.get(position).values.get(favIndex);
    if (fav) {
        holder.fav.setVisibility(View.VISIBLE);
        holder.notfav.setVisibility(View.GONE);
    } else {
        holder.notfav.setVisibility(View.VISIBLE);
        holder.fav.setVisibility(View.GONE);
    }

   if (position == selectedPosition){
     holder.cardView.setCardBackgroundColor(mContext.getColor(R.color.colorAccent));
   }
   else{
       holder.cardView.setCardBackgroundColor(mContext.getColor(R.color.otherColor));
   }

    holder.name.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Toast.makeText(mContext, "Choosen: " + mNames.get(position), Toast.LENGTH_SHORT).show();
            String entity_name = mNames.get(position);                

            selectedPosition = position;
            getadapter().notifydatasetchanged();
        }
    });       
    }
1 голос
/ 08 мая 2019

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

Если ваш ViewHolder находится внутри вашего адаптера, вы можете легко создать метод и переменную для этого.

public class MyAdapter {

    // keeping track of the currently selected item
    private int selected = -1;

    public void updateSelectedItem(int position) {
        int previous = selected;
        selected = position;

        // tell the adapter to re-render the two positions to redraw their backgrounds
        notifyItemChanged(previous);
        notifyItemChanged(selected);
    }


    public class MyViewHolder {

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

            if(selected == position) {
                // show a selected background
            } else {
                // show the normal background
            }

            holder.name.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // notify the adapter the selected item has changed.
                    updateSelectedItem(position);
                }
            });       
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...