我正在开发一个简单的应用程序,其中我在列表的每一行显示一个复选框和一个文本,但是当我选择或选中一个复选框时,我的列表视图中的一些其他复选框会自动检查。 我已经做了很多谷歌,无法找到解决方法... 请帮帮我......
提前完成了......
public void checkevent(View v) throws ParseException
{
lv=(ListView)v.getParent().getParent();
int i=lv.getPositionForView(v);
Object o = lv.getItemAtPosition(i);
String item= o.toString();
int q=item.indexOf("-",0);
String alarm_date=new_date+" "+item.substring(0,q);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Date rdate = (Date)formatter.parse(alarm_date);
set_prog=item.substring(q+1,item.length())+" on "+item.substring(0,q);
if(((CompoundButton) v).isChecked())
{
if(rdate.getTime()>=new Date().getTime())
{
if(program_reminder_main.contains((alarm_date+"--"+item.substring(q+1,item.length()))))
{
Toast.makeText(this,"You have already selected this one", Toast.LENGTH_LONG).show();
((CompoundButton) v).setChecked(false);
}
else {
program_reminder_main+=("~"+alarm_date+"--"+item.substring(q+1,item.length()));
}
//To call the Alarm service Class at respective time
Toast.makeText(this, "Alarm Set For"+" "+item.substring(q+1,item.length())+" on "+item.substring(0,q), Toast.LENGTH_LONG).show();
Intent myIntent = new Intent(MainClass.this, MyAlarmService_Movie.class);
pendingIntent = PendingIntent.getService(MainClass.this, 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC_WAKEUP,rdate.getTime()-30000,pendingIntent);
}
else {
((CompoundButton) v).setChecked(false);
Toast.makeText(MainClass.this, "Alarm can't be set Before to crrent time", Toast.LENGTH_LONG).show();
}
}
else if(!((CompoundButton) v).isChecked()){
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
Toast.makeText(MainClass.this, "Reset Alarm", Toast.LENGTH_LONG).show();
}
}
忽略额外的东西......只需专注于复选框的代码......以及您的信息。我在复选框的属性中设置了上述方法...
答案 0 :(得分:3)
问题是列表会重用您的视图。
假设view1首先与id 1关联,然后检查它。然后,滚动并将view1转换为显示ID 10.但由于未重新创建视图,因此它仍将具有ID为1的项目的复选框状态。
所以基本上解决方案是存储选择了哪些项目,并且在我们的getView方法中,你会这样做
ckeckbox.setChecked(isItemChecked(position));
你必须实现isItemChecked(int position);
一个低效但有效的实现方法是在你的活动中使用一个布尔数组,假设
boolean[] itemChecked;
然后在getView中,在复选框上设置一个监听器。您还可以使用数组设置检查状态。
checkbox .setOnCheckedChangeListener (new OnCheckedChangeListener () {
public void onCheckedChanged (CompoundButton btn, boolean isChecked) {
itemChecked[position] = isChecked;
}
});
checkbox .setChecked(itemChecked[position]);
答案 1 :(得分:1)
复选框状态应保存
声明一个boolean itemChecked并将复选框状态保存在其中
boolean[] itemChecked = new boolean[100];
public View getView(int pos, View inView, ViewGroup parent) {
final CheckBox checkBox = (CheckBox) v.findViewById(R.id.bcheck);
checkBox.setTag(pos); checkBox.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
String position = (String) checkBox.getTag();
if (checkBox.isChecked() == true) {
itemChecked[Integer.valueOf(position)] = checkBox.isChecked();
} else {
itemChecked[Integer.valueOf(position)] = checkBox.isChecked();
} } });
checkBox.setChecked(itemChecked[pos]);
return (v); }
参考:Automatic selection of checkboxes inside listview - android
答案 2 :(得分:0)
在我看来,
你应该仔细看看:
方法:getView(..) 和onClick()
祝你好运