我有一个对话框,其中包含带有复选框的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;
}
答案 0 :(得分:0)
问题出现了,因为我在列表适配器的项目中缓存了新创建的视图。如果列表项不包含复选框或按钮等控件,它可以正常工作(至少没有明显的问题),但在某些情况下可能会成为问题的原因。
避免列表项视图的正确方法reintstantiation是使用在android.widget.Adapter中声明的getView方法的convertView参数。
案件结案。