【问题标题】:Regarding the Checked state of a checkbox inside a list view关于列表视图中复选框的选中状态
【发布时间】:2011-02-14 20:51:40
【问题描述】:

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

提前谢谢....

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

}

忽略多余的东西...只关注复选框的代码...以及您的信息。我已经在复选框的属性中设置了上述方法...

【问题讨论】:

    标签: android


    【解决方案1】:

    问题是 list 重用了你的 view 。

    假设 view1 首先与 id 1 相关联,然后您检查它。然后,您滚动并将 view1 转换为显示 id 10。但由于未重新创建视图,它仍将具有来自 id 1 的项目的复选框状态。

    所以基本上解决方案是将选择的项目存储在某个地方,在我们的 getView 方法中,你会这样做

     ckeckbox.setChecked(isItemChecked(position));
    

    而且你必须实现 isItemChecked(int position);

    一个低效但有效的实现是在你的活动中使用一个布尔数组,比方说

     boolean[] itemChecked;
    

    然后在 getView 中,您在 checkbox 上设置了一个监听器 checked 。您还可以使用数组设置选中状态。

      checkbox .setOnCheckedChangeListener (new OnCheckedChangeListener () {
      public void onCheckedChanged (CompoundButton btn, boolean isChecked) {
      itemChecked[position] = isChecked;
    }
    });
    
    checkbox .setChecked(itemChecked[position]);
    

    【讨论】:

      【解决方案2】:

      复选框状态应该被保存

      声明一个布尔值 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

      【讨论】:

        【解决方案3】:

        在我看来,

        你应该仔细看看:

        方法:getView(..) 和 onClick()

        祝你好运

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-17
          • 1970-01-01
          • 2013-06-14
          • 2016-08-30
          相关资源
          最近更新 更多