簡體   English   中英

RadioButton檢查的狀態在RecyclerView的滾動事件時自動更改

[英]RadioButton checked sate automatically changes on scrolling event of RecyclerView

我在RecyclerView項目中的RadioButton遇到問題。 根據“類型”,我更改了選中的RadioButton。 但是,在加載所有數據之后,當我單擊非選中單選按鈕時,它就會被選中。 但是在滾動了我剛剛單擊的選中的單選按鈕后,該復選框未選中。 我要檢查剛剛單擊的按鈕。 但是它不會保持選中狀態。 我如何得到想要的東西? 誰能幫幫我嗎!!!!!!!

這是我的適配器類:

public class AttendanceAdapterLocal extends  RecyclerView.Adapter<AttendanceAdapterLocal.ViewHolder>{
    private ArrayList<StudentAttendance> attendanceArrayList;
    private Context context;

    public AttendanceAdapterLocal(ArrayList<StudentAttendance> attendanceArrayList) {
        this.attendanceArrayList = attendanceArrayList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_mark_attendance, viewGroup, false);
        context = viewGroup.getContext();
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, int i) {
        final String type = attendanceArrayList.get(i).getType();
        final String id = attendanceArrayList.get(i).getId();
        final String name = attendanceArrayList.get(i).getName();
        final String roll = attendanceArrayList.get(i).getRoll();
        viewHolder.setData(name, roll, type, id);

        final DatabaseHelper databaseHelper = new DatabaseHelper(context);
        final User user = new AccessStorage(context).getUserDetails();
        final String userId = user.getUserId();
        viewHolder.radioPresent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (databaseHelper.updateStudentAttendanceData(id, userId, "P", "0") > 0) {
                    Toast.makeText(context, "Marked successfully.", Toast.LENGTH_LONG).show();
                    viewHolder.radioPresent.setChecked(true);
                } else {
                    Toast.makeText(context, "Unable to mark attendance.", Toast.LENGTH_LONG).show();
                }
            }
        });
        viewHolder.radioAbsent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (databaseHelper.updateStudentAttendanceData(id, userId, "A", "0") > 0) {
                    Toast.makeText(context, "Marked successfully.", Toast.LENGTH_LONG).show();
                    viewHolder.radioAbsent.setChecked(true);
                } else {
                    Toast.makeText(context, "Unable to mark attendance.", Toast.LENGTH_LONG).show();
                }
            }
        });
        viewHolder.radioNone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (databaseHelper.updateStudentAttendanceData(id, userId, "NA", "0") > 0) {
                    Toast.makeText(context, "Marked successfully.", Toast.LENGTH_LONG).show();
                    viewHolder.radioNone.setChecked(true);
                } else {
                    Toast.makeText(context, "Unable to mark attendance.", Toast.LENGTH_LONG).show();
                }
            }
        });
    }

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

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }


    public class ViewHolder extends RecyclerView.ViewHolder {
        // Widgets
        private TextView textName;
        private RadioGroup radioGroup;
        private RadioButton radioPresent, radioAbsent, radioNone;
        // Vars
        private View view;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            view = itemView;

            textName = view.findViewById(R.id.textName);
            radioGroup = view.findViewById(R.id.radioGroup);
            radioPresent = view.findViewById(R.id.radioPresent);
            radioAbsent = view.findViewById(R.id.radioAbsent);
            radioNone = view.findViewById(R.id.radioNone);
        }

        private void setData(String name, String roll, final String type, final String id) {
            textName.setText(roll + ". " + name);

            if (type.equals("P")) {
                radioPresent.setChecked(true);
            } else if(type.equals("A")) {
                radioAbsent.setChecked(true);
            }else if(type.equals("NA")) {
                radioNone.setChecked(true);
            }
        }
    }
}

只是一個小錯誤。 在您的onClick方法中,更改狀態時只需通知適配器即可。

 @Override
        public void onClick(View v) {
            if (databaseHelper.updateStudentAttendanceData(id, userId, "P", "0") > 0) {
                Toast.makeText(context, "Marked successfully.", Toast.LENGTH_LONG).show();
                viewHolder.radioPresent.setChecked(true);
            //Notify adapter 
             attendanceArrayList.notify();
            } else {
                Toast.makeText(context, "Unable to mark attendance.", Toast.LENGTH_LONG).show();
            }
        }

我可以看到,無論您做過同樣的事情,在更改列表中的任何內容時通知適配器都是很重要的。 您可以使用notifyDataSetChanged()或notifyItemChanged(selectedPosition);

如果仍然遇到問題,則應創建一個Model類。

單擊單選按鈕上的“使用接口”,在要在回收器視圖(內部活動)中傳遞的原始列表中進行必要的更改,然后使用notifiDataSetChanged()方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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