2

目标:我正在尝试创建一个每行有 2 个复选框的 UI,每行分成几个部分。我在下面包含了 UI 的屏幕截图。

当前方法:我正在使用 ExpandableListView 并使用 onChildClick 处理数据。

问题:当您单击复选框时,它不会触发 onChildClick 或其他任何东西。单击复选框外的任意位置将触发此事件。

研究:有很多线程建议设置 android:focusable="false",但这对我来说没有任何改变。我将 UI 中的每个元素的可聚焦设置为 false。

复制:我在运行本文中的代码而不进行修改时遇到了完全相同的问题,其中包括 android:focusable="false"。我的很多代码都基于该示例,如果我可以使用该代码库让它工作,我相信我可以让它在我的工作。

当前用户界面

4

3 回答 3

4

我敢打赌,您的 XML 中缺少一行。

您需要在 xml 中包含这两行(第二行是最重要的):

android:focusable="false"
android:focusableInTouchMode="false"

这将允许每个复选框以及行本身都可以单独单击。

然后你onCheckChangedListener在你的适配器中设置监听器getView()来处理复选框(它可以访问位置、视图和父信息)。然后,您onChildClick可以处理 rwo 点击。

于 2012-06-22T06:23:50.073 回答
3

据我所知,复选框确实消耗了事件,因此 OnChildClickListener 不会触发。在标签列表项中,我将这些行添加到复选框中:

<CheckBox
    ...
    android:focusable="false"
    android:clickable="false"
    android:focusableInTouchMode="false"/>

然后我可以简单地使用我的 OnChildClickListener,就好像我不会使用复选框一样。

于 2015-03-03T08:28:37.223 回答
0

我认为这是因为复选框会消耗事件并且不会将其转发到列表项。

如果您想点击框,您可以将 OnClickListener 添加到列表适配器的 getView() 中的框。

我理解你的意思,这个盒子至少被检查了?如果您不需要自定义行为,您只需在“提交”列表时读取该框是否被选中(或下一步检查框)。

阅读评论后,这是您的代码示例,并添加了一些内容:

@Override
public View getView(final int pos, final View convView, ViewGroup parent) {

    //initialize convView, define other local variables, etc. 

    CheckBox cb = (CheckBox) convView.findViewById(R.id.mycheckbox);
    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
            Log.d("ElistCBox2", "listitem position: " + pos); 
        } 
    });

    return convView;
}

请注意,您必须对final匿名类中使用的变量使用修饰符,否则会出现编译器错误。

于 2012-06-21T19:43:01.400 回答