0

我有一个带有复选框的活动,然后在它下面是一个联系人列表,它用每个联系人的复选框填充我的列表视图。我的问题有两个主要问题。

  1. chkbox_foo 在列表视图之外,而 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
    
4

2 回答 2

1

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

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

于 2012-05-09T18:28:29.617 回答
0

chk_bar 可能为空。如果复选框位于列表视图内,则不能在主布局上调用 findViewByID。您必须在它所在/包含的布局上调用它,这将是列表视图项。

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

在自定义适配器的 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()

当您调用 notifyDataSetChanged() 时,列表视图将重新绘制自身(如果它认为源项目实际上已更改。请参见:notifyDataSetChanged 示例

当它重新生成列表视图时,它将遍历您传入的源项目,并且由于您重新生成列表并将所有项目标记为“IsChecked”(或任何您的变量名称),它将检查每个复选框。

于 2012-05-09T19:33:59.163 回答