简体   繁体   English

如何在Android中的ListView滚动上保留复选框状态

[英]How to retain checkbox state on scroll of listview in android

I have a listview of students having one switch and check box on each row item for students attendance. 我有一个学生的列表视图,每个行项目都有一个开关和复选框,供学生出勤。 I would like to retain the switch box and check box changes during scroll. 我想保留滚动框中的开关框和复选框更改。 I tried this way but was unsuccessfull: 我尝试过这种方式,但是没有成功:

AttendanceCreateNewAdapter.cs has following part of code AttendanceCreateNewAdapter.cs具有以下代码部分

 public override View GetView(int position, View convertView, ViewGroup parent)
    {
        View view = convertView;

        // re-use an existing view, if one is available
        // otherwise create a new one
        if (view == null)
        {
            view = activityContext.LayoutInflater.Inflate(Resource.Layout.AttendanceCreatenewRowlistLayout, parent, false);
            view.SetTag((Int32)position, view);
        }


        // initialize size for checkbox and switch box states
        checkBoxState = new bool[Count];
        switchBoxState = new bool[Count];

        item = this[position];


            view.FindViewById<TextView>(Resource.Id.student_name).Text = item.StudentName;
            view.FindViewById<TextView>(Resource.Id.date).Text = GetCustomDateTime(item.Date);
            checkBoxLeave = view.FindViewById<CheckBox>(Resource.Id.on_leave);
            switchPresentAbsent = view.FindViewById<Switch>(Resource.Id.present_absent_switch);

            checkBoxLeave.Tag = position;
            switchPresentAbsent.Tag = position;


            checkBoxLeave.SetOnCheckedChangeListener(null);
            switchPresentAbsent.SetOnCheckedChangeListener(null);

            switchBoxState[position] = item.Present;
            checkBoxState[position] = item.Leave;

            checkBoxLeave.Checked = checkBoxState[position];
            switchPresentAbsent.Checked = switchBoxState[position];

  checkBoxLeave.CheckedChange += delegate (object sender, CompoundButton.CheckedChangeEventArgs e)
        {
            CompoundButton buttonView = sender as CompoundButton;
            if (e.IsChecked)
            {

                int itemPosition = (int)buttonView.Tag;
                UpdateAdapterList(itemPosition, false, true);

            }
        };
            return view;
    }
private void UpdateAdapterList(int myPosition, bool leave, bool present)
    {

        NewAttendanceStudent newItem = this[myPosition];

        var attendanceTaken = new NewAttendanceStudent
        {
            StudentName = newItem.StudentName,
            SectionId = newItem.SectionId,
            ClassId = newItem.ClassId,
            RollNumber = newItem.RollNumber,
            Leave = leave,
            Present = present,
            Date = newItem.Date,
        };
        newAttendanceStudentList.Insert(myPosition,attendanceTaken);
    }

Thank You. 谢谢。

Use setOnClickListener for checkbox and update the state of checkbox in global data which you would have passed for the adapter class and call notifyDataSetChanged(); setOnClickListener用作复选框,并在要为适配器类传递的全局数据中更新复选框的状态,然后调用notifyDataSetChanged(); after setOnClickListener .Use the checkbox data to set the state of checkbox in getView . setOnClickListener之后。使用复选框数据在getView设置复选框的状态。

// initialized in the getView 

     if (globalData.get(position).getCheckbox().equalsIgnoreCase("1")) {
           holder.checkbox.setChecked(true);
     } else {
           holder.checkbox.setChecked(false);
     }

//checkbox clickelistener
 holder.checkbox.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    final GlobalData clk_row = items.get(position);
                       if (Integer.parseInt(clk_row.getCheckbox()) == 0) {

                              globalData.get(position).setCheckbox("1");

                       } else {

                              globalData.get(position).setCheckbox("0");

                       }


                    notifyDataSetChanged();
                }

            });

Try once this may help,in my case it worked: Implement setOnClickListener() method instead of setOnCheckedChangeListener() 尝试一次可能有帮助,对我而言,它可以工作:实现setOnClickListener()方法而不是setOnCheckedChangeListener()

like: 喜欢:

checkBoxSelected.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    instrumentClickListener.onCheckBoxClick(instrumentDTO, checkBoxSelected.isChecked(), position);
                    Log.d(TAG, "checked item is check: " + checkBoxSelected.isChecked() + " \nitem: " + position);
                }
            });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM