-1

here's what I wanna do: I want items in recyclerview to be highlighted when clicked once and back to normal when clicked again.

so I have a recyclerview. naturally I have an adapter too. inside adapter is my viewholder class where I have an onClickListener set on itemview.

whenever it is clicked I getTag(). if it's value is "false" I highlight itemview and setTag("true"), if its value is "true" I color itemview back to normal and setTag("false").

So far everything working fine but now comes the problem: when I scroll up (so that item is out of sight) and down again value of tag seems gone also highlighting of item.

I tried setIsRecycable(false) but isn't working.

How can I preserve tags/highlighting on those items??

Edit: public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener {

final RelativeLayout rl = (RelativeLayout)itemView.findViewById(R.id.rl1);
final RelativeLayout rl2 = (RelativeLayout)itemView.findViewById(R.id.rl2);
public ViewHolder(final View itemView) {
    super(itemView);

    itemView.setTag("f");


        //text layout
        mSenderUsernameView = (TextView) itemView.findViewById(R.id.tv_username);
        mSenderMessageView = (TextView) itemView.findViewById(R.id.et_message);
        mSenderTimeView = (TextView) itemView.findViewById(R.id.tv_time);

        mSenderUsernameView.setOnClickListener(this);
        mSenderMessageView.setOnClickListener(this);
        mSenderTimeView.setOnClickListener(this);
        rl.setOnClickListener(this);
        rl2.setOnClickListener(this);

        }   

@Override
public void onClick(View v) {
    if (v.getId() == rl.getId() || v.getId() == rl2.getId() || v.getId() == mSenderUsernameView.getId() ||
            v.getId() == mSenderMessageView.getId() || v.getId() == mSenderTimeView.getId()) {


        //check if msg is selected or not
        //not selected
        if(itemView.getTag().toString().equals("f")){                rl.setBackgroundResource(R.drawable.selected_msg_color_roundings);
            rl2.setBackgroundResource(R.drawable.selected_msg_color_roundings);
            itemView.setTag("t");
        }
        //selected
        else if(itemView.getTag().toString().equals("t")){
            //Toast.makeText(context, mMessages.get(getAdapterPosition()).getUsername()
            //+ " at " + mPos + " is " + va, Toast.LENGTH_LONG).show();
            rl.setBackgroundResource(R.drawable.msg_color_roundings);
            rl2.setBackgroundResource(R.drawable.msg_color_roundings);

            itemView.setTag("f");

        }
    }
Dave Gee
  • 47
  • 1
  • 1
  • 10

2 Answers2

0

A way to keep track of which positions in your RecyclerView have been clicked is by using an internal dataset in your Adapter, like so:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ViewHolder> {

boolean[] dataset;
public class ViewHolder extends RecyclerView.ViewHolder {
    RelativeLayout mRelativeLayout;

    public ViewHolder(RelativeLayout v) {
        super(v);
        mRelativeLayout = v;
    }
}

public RVAdapter(boolean[] dataset) {
    this.dataset = dataset;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RelativeLayout v = (RelativeLayout) LayoutInflater.from(parent.getContext())
            .inflate(R.layout.rv_item, parent, false);
    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.mRelativeLayout.setTag(position);
    holder.mRelativeLayout.setEnabled(dataset[position]);
    holder.mRelativeLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int position = (int) view.getTag();
            dataset[position] = !dataset[position];
        }
    });
}

@Override
public int getItemCount() {
    return dataset.length;
}
}

In this example the view is just enabled/disabled but it illustrates how you could achieve what you need.

  • first of all thanks for your answer. have you used that code before? does it actually work? haven't found time to try it out yet – Dave Gee Mar 04 '17 at 10:51
  • I haven't used this exact code but I've used similar implementations several times. Whenever you get the time you might want to debug with a bunch of breakpoints to see for yourself how the code behaves. – Carlos Sifuentes Mar 04 '17 at 16:17
0

Solved it! Key was to keep track of selected items using SparseBooleanArray not tags. Selection of items is done with the help of StateListDrawable

how to highlight the selected Item of Recycler View?

Community
  • 1
  • 1
Dave Gee
  • 47
  • 1
  • 1
  • 10