[英]How recyclerview onscroll works? Not getting expected result
我的項目中有一個recyclerview,我已使用其適配器在recyclerview中添加了一個聯系人列表,在其viewHolder的onClick中,我希望將聯系人列表的每個位置標記為已選中(我在此處使用綠色表示選擇) ,為此,我嘗試了以下代碼段:
@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());
}
}
選定的項目是一個稀疏的布爾數組,用於存儲聯系人每個位置的狀態,我將以下drawable用作布局的背景:
<?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();
}
}
轉接器類別
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();
}}
轉接座類
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);
}
}
}
所有這些都可以正常工作,但是問題是當我滾動視圖時,已經顯示了視圖的其他一些位置。 我希望有人指出我犯的錯誤。
嘗試這個
@Override
public void onClick(View view) {
if (selectedItems.get(getAdapterPosition())) {
selectedItems.delete(getAdapterPosition());
} else {
selectedItems.put(getAdapterPosition(), true);
}
notifyItemChanged(int position)
}
和
@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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.