หลังจากทำเครื่องหมายในช่องใน recyclerview ใน Android แล้ว ช่องทำเครื่องหมายสุ่มอื่นๆ จะถูกตรวจสอบโดยอัตโนมัติ

ฉันมี recyclerview หนึ่งรายการในแอปพลิเคชัน Android ของฉัน โดยแสดงรายการบันทึกบางส่วนพร้อมช่องทำเครื่องหมาย ในขณะที่เลือกบันทึกโดยทำเครื่องหมายในช่อง ฉันพบว่าเมื่อฉันตรวจสอบบันทึกแล้ว บันทึกอื่นๆ จาก recyclerview จะถูกเลือกโดยอัตโนมัติ และบางครั้งช่องทำเครื่องหมายที่เลือกไว้ก่อนหน้านี้จะถูกยกเลิกการเลือกโดยอัตโนมัติ ฉันลองใช้วิธีแก้ปัญหาอื่นจาก "จะตรวจสอบได้อย่างไรว่าช่องทำเครื่องหมายถูกทำเครื่องหมายใน jQuery หรือไม่", "การทำเครื่องหมายในช่องใน listview ทำให้ช่องทำเครื่องหมายสุ่มอื่น ๆ ตรวจสอบด้วย", "ช่องทำเครื่องหมาย Android RecyclerView จะสุ่มตรวจสอบ" แต่สิ่งนี้ไม่ได้ ไม่ได้แก้ปัญหาของฉัน

public class LeadListAdapter extends RecyclerView.Adapter<LeadListAdapter.LeadListViewHolder> {

private List<Customer> customerDataList;
private Activity mActivity;
public static List<PEdgeLeads> selectedLeadsList;
public static List<Customer> selectedCustomerList;
private List<PEdgeLeads> leadDataList;
private int dataSize = 0;
public static Context mContextAdapter;

public LeadListAdapter(List<Customer> customerDetails, List<PEdgeLeads> leadDetails, Activity activity) {

    System.out.println("Inside LeadList Adapter Constructor");
    leadDataList = new ArrayList<PEdgeLeads>();
    customerDataList = new ArrayList<Customer>();
    selectedLeadsList = new ArrayList<PEdgeLeads>();
    selectedCustomerList = new ArrayList<Customer>();

    dataSize = leadDataList.size();
    System.out.println("lead list :: " + leadDataList.size() + " and customer data list :: " + customerDataList.size());

    this.customerDataList = customerDetails;
    this.leadDataList = leadDetails;
    System.out.println("Lead Details List :: " + this.leadDataList.get(0).getLeadName());
    System.out.println("Customer Details List :: " + this.customerDataList.get(0).getFirstName());
    this.mActivity = activity;
}

@Override
public LeadListAdapter.LeadListViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

    View itemView = LayoutInflater.
            from(viewGroup.getContext()).
            inflate(R.layout.lead_list_view, viewGroup, false);
    System.out.println("Inflating Lead List View NOW");

    return new LeadListViewHolder(itemView);
}

@Override
public void onBindViewHolder(final LeadListAdapter.LeadListViewHolder viewHolder, final int position) {

    viewHolder.leadName.setText(leadDataList.get(position).getLeadName());

    //if (customerDataList.size() < position) {

    if (!customerDataList.get(position).getContactNumber().equals("") || customerDataList.get(position).getContactNumber() != null) {
        final String mobileNumber = customerDataList.get(position).getContactNumber().toString().trim();

        viewHolder.leadMobile.setText(mobileNumber);
        System.out.println("Mobile NUmber about to get registered");

    boolean isChecked = viewHolder.isLeadChecked;

    viewHolder.leadCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                System.out.println("Lead Added to list");
                selectedCustomerList.add(customerDataList.get(position));
                selectedLeadsList.add(leadDataList.get(position));
                System.out.println("Selected Lead List :: " + selectedLeadsList.toString());
                System.out.println("Selected Customer List :: " + selectedCustomerList.toString());
            } else {
                System.out.println("Lead removed from list");
                selectedCustomerList.remove(customerDataList.get(position));
                selectedLeadsList.remove(leadDataList.get(position));
                System.out.println("Selected Lead List :: " + selectedLeadsList.toString());
                System.out.println("Selected Customer List :: " + selectedCustomerList.toString());
            }
        }
    });
}

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

public static class LeadListViewHolder extends RecyclerView.ViewHolder {

    protected TextView leadName;
    protected TextView leadEmail;
    protected TextView leadMobile;
    protected TextView redPopup;
    protected TextView greyPopup;
    protected CheckBox leadCheckBox;
    protected View verticalSeparator;
    protected boolean isLeadChecked;

    public LeadListViewHolder(View v) {
        super(v);

        leadName = (TextView) v.findViewById(R.id.lead_name);

        leadEmail = (TextView) v.findViewById(R.id.lead_email);

        leadMobile = (TextView) v.findViewById(R.id.lead_mobile);

        redPopup = (TextView) v.findViewById(R.id.red_popup);

        greyPopup = (TextView) v.findViewById(R.id.grey_popup);

        leadCheckBox = (CheckBox) v.findViewById(R.id.lead_checkbox);

        verticalSeparator = v.findViewById(R.id.separator);

        mContextAdapter = v.getContext();

        isLeadChecked = false;

        System.out.println("Got Lead Name's Id and handle");

       }
   }
}

นี่คือรหัสของฉันสำหรับอะแดปเตอร์ ฉันใหม่ในการเข้ารหัส Android โปรดช่วยฉันแก้ไขปัญหาของฉัน ขอบคุณ


person Sanket Ranaware    schedule 28.02.2016    source แหล่งที่มา


คำตอบ (1)


คุณกำลังใช้ RecyclerView คุณลักษณะที่คุณพบคือส่วน การรีไซเคิล

รายการจะถูกลบออกและนำกลับมาใช้ใหม่ หากคุณได้ทำเครื่องหมายในช่องในมุมมองที่ถูกลบออก มุมมองใหม่ที่แนบมากับปลายอีกด้านในการเลื่อนจะมีการตรวจสอบด้วย เนื่องจากคุณเปลี่ยนสถานะของ leadCheckBox ในการโทรกลับเท่านั้น

คุณควรเสมอเริ่มต้นมุมมองของคุณด้วยสถานะปัจจุบัน ถ้าตรวจแล้วให้ตรวจ ถ้าไม่ใช่อย่าทำ

เพิ่ม viewHolder.leadCheckBox.setChecked(isItemChecked); ลงใน onBindViewHolder แล้วมันจะได้ผล คุณจะต้องแทนที่ isItemChecked ด้วยตรรกะในการดึงข้อมูลสถานะจริงของรายการที่ตำแหน่ง...

person David Medenjak    schedule 28.02.2016
comment
แน่นอนว่าฉันจะลอง และแจ้งให้คุณทราบหากยังมีปัญหาใดๆ อยู่...ขอบคุณ - person Sanket Ranaware; 29.02.2016