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