我有一个包含复选框的活动,然后在其下面是一个联系人列表,其中列出了我的列表视图以及每个联系人的复选框。我有两个主要问题源于我的问题。
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
答案 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
一旦你有了这个工作,其余的很简单:
当用户点击主复选框时:
当您调用notifyDataSetChanged()时,listview将重新绘制自己(如果它认为源项目实际上已被更改。请参阅:notifyDataSetChanged example)
当它重新生成listview时,它将遍历你传入的源项,并且由于你重新生成了列表并将所有项标记为“IsChecked”(或者你的变量名称是什么),它将检查每个复选框。 / p>