Reputation: 1855
I have a recyclerview in my project, I have added a list of contacts in recyclerview using its adapter, in the onClick of its viewHolder I want to mark each position of my contact list as selected (I am using green color here to indicate selection), in order to do this I have tried the snippets below:
@Override
public void onClick(View view) {
if (selectedItems.get(getAdapterPosition(), false)) {
selectedItems.delete(getAdapterPosition());
view.setSelected(false);
contacts_name.setTextColor(Color.BLACK);
phone_number.setTextColor(Color.BLACK);
} else {
selectedItems.put(getAdapterPosition(), true);
view.setSelected(true);
contacts_name.setTextColor(Color.WHITE);
phone_number.setTextColor(Color.WHITE);
Log.e("layout ", " Pos " + getLayoutPosition());
Log.e("Adapter ", " Pos " + getAdapterPosition());
}
}
selected items is a sparse Boolean Array to store the states of each position of contacts and I have used below drawable as background of my layout:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/selector_green_bg"
android:state_pressed="false" android:state_selected="true" />
<item android:drawable="@color/light_grey_color"
android:state_selected="false" />
</selector>
OnBindViewHolder:
@Override
public void onBindViewHolder(ChooseOptionHolder holder, int position) {
try {
holder.contacts_name.setText(contact_name_list.get(position));
holder.phone_number.setText(phone_nums.get(position));
} catch (Exception e) {
e.printStackTrace();
}
}
Adapter class
public class ChooseOptionAdapter extends RecyclerView.Adapter<ChooseOptionHolder> {
private ArrayList<String> contact_name_list, phone_nums;
private Context context;
View layoutView;
ChooseOptionAdapter chooseOptionAdapter = this;
public ChooseOptionAdapter(Context context, ArrayList<String> contacts_list, ArrayList<String> phone_num_list) {
this.contact_name_list = contacts_list;
this.phone_nums = phone_num_list;
this.context = context;
}
@Override
public ChooseOptionHolder onCreateViewHolder(ViewGroup parent, int viewType) {
layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.choose_contact_list, null);
ChooseOptionHolder rcv = new ChooseOptionHolder(layoutView, chooseOptionAdapter);
return rcv;
}
@Override
public void onBindViewHolder(ChooseOptionHolder holder, int position) {
try {
holder.contacts_name.setText(contact_name_list.get(position));
holder.phone_number.setText(phone_nums.get(position));
} catch (Exception e) {
e.printStackTrace();
}
if (holder.selectedItems.get(position)) {
holder.itemView.setSelected(true);
holder.contacts_name.setTextColor(Color.WHITE);
holder.phone_number.setTextColor(Color.WHITE);
} else {
holder.itemView.setSelected(false);
holder.contacts_name.setTextColor(Color.BLACK);
holder.phone_number.setTextColor(Color.BLACK);
}
Log.e("boolean ", "array " + holder.selectedItems);
}
@Override
public int getItemCount() {
return this.contact_name_list.size();
}}
Adapter holder class
public class ChooseOptionHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
public TextView contacts_name;
public TextView phone_number;
int position;
public SparseBooleanArray selectedItems = new SparseBooleanArray();
ArrayList<Boolean> status = new ArrayList<>();
ChooseOptionAdapter chooseOptionAdapter1;
public ChooseOptionHolder(View itemView, ChooseOptionAdapter chooseOptionAdapter) {
super(itemView);
itemView.setOnClickListener(this);
contacts_name = itemView.findViewById(R.id.contacts_name);
phone_number = itemView.findViewById(R.id.phone_number);
}
@Override
public void onClick(View view) {
position=getAdapterPosition();
if (selectedItems.get(position,false)){
selectedItems.delete(position);
view.setSelected(false);
contacts_name.setTextColor(Color.BLACK);
phone_number.setTextColor(Color.BLACK);
} else {
selectedItems.put(position,true);
view.setSelected(true);
contacts_name.setTextColor(Color.WHITE);
phone_number.setTextColor(Color.WHITE);
Log.e("layout ", " Pos " + position);
}
}
}
All this works perfectly but the problem is when I scrolls the view, some other positions of the view is already shown selected. I hope somebody can point out the mistake I have done.
Upvotes: 0
Views: 120
Reputation: 500
Try this
@Override
public void onClick(View view) {
if (selectedItems.get(getAdapterPosition())) {
selectedItems.delete(getAdapterPosition());
} else {
selectedItems.put(getAdapterPosition(), true);
}
notifyItemChanged(int position)
}
And
@Override
public void onBindViewHolder(ChooseOptionHolder holder, int position) {
try {
holder.contacts_name.setText(contact_name_list.get(position));
holder.phone_number.setText(phone_nums.get(position));
if(selectedItems.get(position)){
view.setSelected(true);
contacts_name.setTextColor(Color.WHITE);
phone_number.setTextColor(Color.WHITE);
}else {
view.setSelected(false);
contacts_name.setTextColor(Color.BLACK);
phone_number.setTextColor(Color.BLACK);
}
} catch (Exception e) {
e.printStackTrace();
}
}
Upvotes: 0