Изменить стиль элемента RecyclerView на клике - PullRequest
0 голосов
/ 11 марта 2019

Я бы хотел изменить цвет элемента в RecyclerView при нажатии на него. Но я хочу, чтобы он оставался цветным даже после нажатия .., пока я не нажму на другой элемент (который станет цветным).

В методе onBindViewHolder в RecyclerViewAdapter я попробовал это:

     holder.linearlayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            holder.linearlayout.setBackgroundColor(Color.RED);
        }
     }

Проблема в том, что , если Я пытаюсь установить color в методе onBindViewHolder, элемент остается цветным даже после того, как я щелкну по другому элементу, потому что в методе onBindViewHolder я вижу только фактический элемент.

Есть ли способ установить все элементы в исходное состояние (не окрашенный элемент) и установить цвет только для последнего нажатого элемента?

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Это просто, просто объявите одну глобальную переменную

int mPreviousIndex = -1

, затем внутри вашего onclick

holder.linearlayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
          mPreviousInde = position           //postition- Position of Adapter
    }
 }

после этого запишите это в свой onBindViewHolder

if(mPreviousIndex==position){
     holder.linearlayout.setBackgroundColor(Color.RED);    //color on item selecting item
}
else{
     holder.linearlayout.setBackgroundColor(Color.WHITE);    //color on item unselecting item
}
0 голосов
/ 11 марта 2019

Я создал образец RecyclerView адаптера. Вы можете заменить TextView на LinearLayout. Вы должны использовать setBackgroundColor() вместо setTextColor()

/**
 * Created by beyazid on 11.03.2019.
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

private Context context;
private LayoutInflater inflater;
private ArrayList<String> list;
private int indexOfColoredItem = -1;

public MyAdapter(Context context, ArrayList<String> list) {
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.context = context;
    this.list = list;
}

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

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    holder.bindItem(position);
    holder.tvDummy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            indexOfColoredItem = position;
            notifyDataSetChanged();
        }
    });
}

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

public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView tvDummy;
    public MyViewHolder(View itemView) {
        super(itemView);
        tvDummy = itemView.findViewById(R.id.text);
    }
    void bindItem(int pos) {
        String txt = list.get(pos);
        tvDummy.setText(txt);
        if(indexOfColoredItem==pos){
            tvDummy.setTextColor(ContextCompat.getColor(context, R.color.selectedColor));
        } else{
            tvDummy.setTextColor(ContextCompat.getColor(context, R.color.yourDefaulColor));
        }
    }
}
}
0 голосов
/ 11 марта 2019

Это очень просто.По сути, я бы посоветовал вам:

  1. Сохранить индекс вашего последнего нажатого элемента в вашем адаптере.
  2. Делайте ваши раскраски только внутри onBindViewHolder (а не внутри вашего onClickListener) на основе индекса (скажем, если у индекса есть какое-то значение по умолчанию, например -1, вы не окрашиваете, если у него 0 ..count, вы делаетераскраска)
  3. Создайте метод в своем адаптере, который a) сохраняет последний нажатый индекс в переменной b) обновляет индекс новым значением c) вызывает notifyItemChanged для старого индекса d) вызывает notifyItemChanged для нового индекса
  4. Вызовите только что созданный метод в вашем onClickListener.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...