如何从一个复选框中选中列表视图中的所有复选框

时间:2012-05-09 18:20:59

标签: android listview checkbox

我有一个包含复选框的活动,然后在其下面是一个联系人列表,其中列出了我的列表视图以及每个联系人的复选框。我有两个主要问题源于我的问题。

  1. chkbox_foo在listview之外,chk_bar在里面。 chk_foo有效,但是在初始化之后与chk_bar相关的任何内容都会导致应用程序崩溃。此外,如果我为chkbox_bar创建setOnCheckedChangeListener,也会导致应用程序崩溃。有谁知道为什么会发生这种情况以及如何解决这个问题?

    btn_foo = (Button) findViewById(R.id.btn_foo);
    barList = (ListView) findViewById(R.id.lv_barList);
    chk_foo = (CheckBox) findViewById(R.id.cb_foo);
    chk_bar = (CheckBox) findViewById(R.id.cb_bar);
    
    // set checkboxes state as false at beginning
    chkboxAllVisible = false;
    chkboxSingleChk = false;
    
    chk_foo.setChecked(chkboxAllVisible);
    chk_bar.setChecked(chkboxChk);  <---App crashes here
    
    // Outside of listview checkbox 
    chk_foo.setOnCheckedChangeListener(new OnCheckedChangeListener(){
    
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            Log.d(TAG, "checkbox changed " + isChecked);
            if(isChecked){
                chkboxAllVisible = true;
                chk_bar.setChecked(isChecked); <---app crashes here too
            } 
        }
    });
     // Outside of listview checkbox 
    chk_bar.setOnCheckedChangeListen... <---app crashes here also
    

2 个答案:

答案 0 :(得分:1)

当用户点击“主”复选框时,您需要遍历绑定到ListView的列表。然后,通过单独访问每一行,您可以标记每一行的复选框。

如果您需要特定示例,请发布ListView的代码。

答案 1 :(得分:0)

chk_bar可能为null。如果复选框位于列表视图中,则无法在主布局上调用findViewByID。你必须在它所包含/包含的布局上调用它,这将是listview项目。

那就是说,你不需要这样做。如果你有复选框的联系人,我猜你正在使用某种自定义适配器?如果是这样,好,那么这将很容易。我还假设您正在跟踪某个项目/联系人是否已经过检查(如果没有,您还需要实现它,请参阅下面的教程)

在自定义适配器的getView中,在生成视图时,需要查看数据对象,如果IsChecked值为true,则选中复选框。

public View getView(int position, View convertView, ViewGroup parent)
{
    //Inflate your view
    //View listViewLayout = ...

    //Here is where you get the reference to the checkbox
    Checkbox chkBox = (CheckBox)listViewLayout.findViewById(R.id.cb_bar);

    //Get the data object from whatever your source is (maybe an array list?)
    SomeObj curObj = (SomeObj)listOfItems.get(position);

    chkBox.setChecked(curObj.IsChecked);
}

以下是有关如何为Listview实现自定义适配器的完整教程: http://www.ezzylearning.com/tutorial.aspx?tid=1763429&q=customizing-android-listview-items-with-custom-arrayadapter

一旦你有了这个工作,其余的很简单:

当用户点击主复选框时:

  1. 重新生成项目列表,但强制所有复选框值为true。
  2. 调用adapter.notifyDataSetChanged()
  3. 当您调用notifyDataSetChanged()时,listview将重新绘制自己(如果它认为源项目实际上已被更改。请参阅:notifyDataSetChanged example

    当它重新生成listview时,它将遍历你传入的源项,并且由于你重新生成了列表并将所有项标记为“IsChecked”(或者你的变量名称是什么),它将检查每个复选框。 / p>