关于列表视图中复选框的Checked状态

时间:2011-02-14 11:10:29

标签: android

我正在开发一个简单的应用程序,其中我在列表的每一行显示一个复选框和一个文本,但是当我选择或选中一个复选框时,我的列表视图中的一些其他复选框会自动检查。 我已经做了很多谷歌,无法找到解决方法... 请帮帮我......

提前完成了......

 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();
    }

}

忽略额外的东西......只需专注于复选框的代码......以及您的信息。我在复选框的属性中设置了上述方法...

3 个答案:

答案 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()

祝你好运