簡體   English   中英

recyclerview onscroll如何工作? 沒有得到預期的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM