android - ListView 中的复选框单击

标签 android android-listview onclicklistener android-checkbox

我有一个包含一些文本和一个复选框的 ListView 。我可以单击复选框,检查会发生变化,但是当我尝试监听正在更改的检查或单击时,监听器永远不会触发。

我在 Activity 中有 ListView (不是 ListActivity)

schedule.xml 布局:

<?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"
    android:id="@+id/schedulerLayout">
<LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        android:paddingBottom="10dp">
    <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="horizontal">
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/currentHours"
                android:textSize="50dp"/>
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="50dp"
                android:text=":"/>
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/currentMinutes"
                android:textSize="50dp"/>
    </LinearLayout>
    <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:orientation="vertical">
        <!--vertical filler for am/pm display -->
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/ampm"/>
    </LinearLayout>
    <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:paddingLeft="10dp"
            android:orientation="vertical">
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/currentDayOfWeek"/>
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/currentDate"/>
    </LinearLayout>
</LinearLayout>

<Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/scheduleButton"
        android:text="@string/newSchedule"/>
<View
        android:layout_width="fill_parent"
        android:layout_height="1dip"
        android:background="#FFFFFFFF"/>

<ListView
        android:id="@+id/scheduler_list_view"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:focusableInTouchMode="false"/>
</LinearLayout>

schedulerow.xml:

<?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="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true">
<TextView
        android:id="@+id/scheduleListTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:layout_alignParentTop="true"
        android:text="Title"/>

<TextView
        android:id="@+id/scheduleListDays"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/scheduleListTitle"
        android:text="Days"/>
<TextView
        android:id="@+id/scheduleListMonths"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/scheduleListDays"
        android:text="Months"/>
<View
        android:id="@+id/schedulerSeparator"
        android:layout_width="fill_parent"
        android:layout_height="1dip"
        android:background="#FFFFFFFF"
        android:layout_below="@id/scheduleListMonths"/>
<CheckBox
        android:id="@+id/scheduleCheckBox"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:clickable="true"
        android:layout_above="@id/schedulerSeparator"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"/>
<TextView
        android:id="@+id/scheduleListTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/scheduleCheckBox"
        android:text="Time"/>
</RelativeLayout>

我正在填写这样的数据:

SimpleAdapter adapter = new SimpleAdapter(this,
            data,
            R.layout.schedulerow,
            new String[] {"Title","Time","Day", "Month"},
            new int[] { R.id.scheduleListTitle, R.id.scheduleListTime,R.id.scheduleListDays, R.id.scheduleListMonths});

listView.setAdapter(adapter);

如果我尝试向复选框添加监听器,它不会执行任何操作。有什么建议么?我查看了大量示例代码和类似问题,但似乎都不起作用。

最佳答案

一种解决方案是忘记列表项单击监听器,并为除复选框之外的项目的其余部分使用另一个监听器。在项布局 xml 中,将其他 View 放在单个布局中,并在此设置单击监听器并设置像往常一样检查复选框上的监听器。两者都可以毫无问题地工作。不要使用列表项点击监听器。

class MySimpleAdapter extends SimpleAdapter {
 ... 
   @Override
   void getView(.....) {
       View view = super.getView(.....);
       view.findViewById(R.id.checkboxid).setOnCheckChangedListner(checklistener);
       view.findViewById(R.id.restOfitemview).setOnClickListner(clickListner);
       return view;
    }
}

定义两个监听器并按如上所示进行设置。

编辑:首先尝试使用 MySimpleAdapter 仅设置 checkchangelistener 的方法(阻止焦点放在复选框上)。如果这不起作用,则使用上述划分项目布局的解决方案。

关于android - ListView 中的复选框单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13497092/

相关文章:

android - CheckedTextView 未被检查

java - setResult 无法在实现 onClickListener 的 java 类中工作

android - 带有 fragment 的正确开关盒 onclicklistener

android - 使用 aapt.exe 工具将资源添加到 apk 文件?

android - RecyclerView 安卓 : Getting an item at a particular position

android ListView 创建一个 3 列 View

android - onclick 在恢复方法中不起作用

android - 通过 Adob​​e Air 应用程序启动 Android 应用程序

android - ViewPropertyAnimator 与 TransitionDrawable

android - 21000 毫秒的套接字超时从何而来?