首先,让我向您展示我所拥有的代码,以便完成标题所说的内容。
但在此之前,这就是行动的样子:
http://i.imgur.com/UzexgEA.jpg
忽略已经设法隐藏它们的按钮,只留下每行中的复选框。
我的活动布局(截图中的那个)是:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/findSelected"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="registrarAsistencia"
android:text="Registrar Asistencia" />
<ListView
android:id="@+id/listaAlumnos"
android:layout_width="fill_parent"
android:layout_height="376dp"
android:layout_weight="2.29" />
<Button
android:id="@+id/btnChecarBoxes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="seleccionarTodosNinguno"
android:text="Seleccionar / Deseleccionar todo" />
</LinearLayout>
这里是列表内容的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:orientation="vertical" >
<TextView
android:id="@+id/rowTextView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="10dp"
android:textSize="16sp"
android:textStyle="bold"/>
<TextView
android:id="@+id/rowTextView2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="10dp"
android:textSize="16sp"
android:textStyle="italic"/>
</LinearLayout>
<CheckBox
android:id="@+id/CheckBox01"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:focusable="false"
android:padding="10dp" />
</RelativeLayout>
我之前提到需要隐藏按钮和复选框,只有在满足某些条件时才会发生这种情况。
我已在列表视图中添加了setOnItemClickListener,其中包含以下代码:
mainListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View item, int position, long id) {
final Alumno Alumno = listAdapter.getItem(position);
if(!verEstadisticas){
Alumno.toggleChecked();
Toast.makeText(AlumnosAsistencia.this, Alumno.getNoControl() + " " + Alumno.getName(), Toast.LENGTH_LONG).show();
final AlumnoViewHolder viewHolder = (AlumnoViewHolder) item.getTag();
viewHolder.getCheckBox().setChecked(Alumno.isChecked());
runOnUiThread(new Runnable() {
public void run() {
viewHolder.getCheckBox().setVisibility(View.GONE);
}
});
}else{
// Here Im supposed to do something else, but check boxes needs to be hidden
}
}
});
这是AlumnoViewHolder的代码:
class AlumnoViewHolder {
private CheckBox checkBox;
private TextView textView1;
private TextView textView2;
public AlumnoViewHolder() {
}
public AlumnoViewHolder(TextView textView1, TextView textView2, CheckBox checkBox) {
this.checkBox = checkBox;
this.textView1 = textView1;
this.textView2 = textView2;
}
public CheckBox getCheckBox() {
return checkBox;
}
public void setCheckBox(CheckBox checkBox) {
this.checkBox = checkBox;
}
public TextView getTextView1() {
return textView1;
}
public void setTextView1(TextView textView1) {
this.textView1 = textView1;
}
public TextView getTextView2() {
return textView2;
}
public void setTextView2(TextView textView2) {
this.textView2 = textView2;
}
}
正如您所看到的,我只能通过单击其行来隐藏复选框,我在其中获取View项参数和item.getTag()方法,但是,我无法找到在onItemClick方法之外执行此操作的方法。我用Google搜索解决方案,发现了这个:
for(int i=0; i < mainListView.getCount(); i++){
RelativeLayout itemLayout = (RelativeLayout) mainListView.getChildAt(i);
CheckBox cb = (CheckBox) itemLayout.findViewById(R.id.CheckBox01);
cb.setVisibility(View.GONE);
}
然而,它没有用。
另外,我还有其他小问题。在屏幕截图中,您可以看到活动。现在,如果我选中一个复选框,然后向下滚动,“移动”屏幕外的复选框,然后再次向上滚动到该复选框,复选框将被取消选中,这意味着它没有保存它的状态。一旦它在屏幕之外,我怎样才能确保它“记住”它的状态?
请原谅我的英语和解释事情的方式,哈哈。
非常感谢所有可能的帮助。提前谢谢!
答案 0 :(得分:1)
那么,不应该在onItemClick
中进行,而应考虑将复选框的可视状态存储到数组中(true / false)并使用适配器的getView
中的数组。考虑一下:
// Click check box row #1 => suppose to be hidden => set state hidden of check box #1 in the array = true
//在getView中
if(checkbox_visual_state_array[data_position] == true){
holder.checkbox.setVisibility(View.GONE);
}else{
holder.checkbox.setVisibility(View.VISIBLE);
}
希望这有帮助。
答案 1 :(得分:0)
关于记住复选框状态的问题。你必须自己管理它。您需要存储每个复选框的状态。然后,您必须更新自定义适配器的getView()方法,以便在返回视图时设置复选框的状态。如果您不使用自定义适配器,则创建自定义适配器并覆盖getView方法。