列表视图中的复选框有时不起作用

时间:2011-11-10 11:33:38

标签: android

我有一个对话框,其中包含带有复选框的listview和一个按钮,如果选中至少一个复选框,该按钮将变为可见。单击该按钮可从列表视图中删除选中的行。但是在这个对话框中,我对列表中的复选框有一个奇怪的行为。例如,如果列表包含四行,并且我检查其中一行,则不再可以检查其他项目。如果我在列表中添加更多项目,那么我可以检查多个项目,但如果我删除了一些项目,则剩余项目将无法检查。

PS。有没有办法解决或解决它?

UPDATE1:我发现复选框不会变为绝对无效,如果要尝试多次单击,则可以检查它。看起来像复选框周围的区域被识别为onClick区域设置得太少。

UPDATE2:我还发现如果我从对话框初始化代码中注释这一行

getWindow()。setLayout(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);

然后在对话框实例化后立即取消选中列表中的所有复选框。

对话框布局

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:minHeight="200dip"
  android:orientation="vertical"
  android:background="@android:color/white"
>
  <ListView
    android:id="@+id/list_view"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="1"
    android:divider="@color/list_divider"
    android:dividerHeight="2px"
    android:focusable="false"
    android:clickable="false"
    android:choiceMode="multipleChoice"
    />
  <LinearLayout
    android:id="@+id/buttons_pane"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:visibility="gone"
  >
    <Button
      android:id="@+id/misc_list_remove_btn"
      android:layout_width="fill_parent"
      android:layout_height="48dip"
      android:text="@string/remove"
    />
  </LinearLayout>
</LinearLayout>

项目布局

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="47dip"
  android:orientation="horizontal"
  android:background="@android:color/white"
>
  <CheckBox
    android:id="@+id/misc_selectable_list_item_chk"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:checked="false"
  />
</LinearLayout>

我以这种方式创建对话

public ShowSelectableListDialog (Activity context, int titleId)
{
    super (context);
    setContentView (R.layout.misc_selectable_list_dlg);
    setTitle (titleId);
    getWindow ().setLayout (LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
    adapter_ = setupListAdapter (getInitialValues (), context);
    ListView listView = (ListView)findViewById (R.id.list_view);
    listView.setAdapter (adapter_);
    listView.setItemsCanFocus (false);
    Button removeButton = (Button)findViewById (R.id.misc_list_remove_btn);
    removeButton.setOnClickListener (this);
  }

和列表中的项目

@Override
protected View instantiateView (Object ... params)
{
  String title = (String)params[0];
  CompoundButton.OnCheckedChangeListener checkedChangeListener =
    (CompoundButton.OnCheckedChangeListener)params[1];

  LayoutInflater inflater = Utils.getInflater (getContext ());
  View view = inflater.inflate (R.layout.misc_selectable_list_item, null);
  view.setId (title.hashCode ());
  CheckBox chk = (CheckBox)view.findViewById (R.id.misc_selectable_list_item_chk);
  chk.setText (title);
  chk.setOnCheckedChangeListener (checkedChangeListener);
  return view;
}

1 个答案:

答案 0 :(得分:0)

问题出现了,因为我在列表适配器的项目中缓存了新创建的视图。如果列表项不包含复选框或按钮等控件,它可以正常工作(至少没有明显的问题),但在某些情况下可能会成为问题的原因。

避免列表项视图的正确方法reintstantiation是使用在android.widget.Adapter中声明的getView方法的convertView参数。

案件结案。