Android:ExpandableListView中的Checkbox即使使用focusable = false也不会触发onChildClick

时间:2012-06-21 19:36:59

标签: android android-layout android-listview expandablelistview android-linearlayout

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

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

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

研究:有很多线程建议设置android:focusable =“false”,但这对我没有任何改变。对于UI中的每个元素,我都将focusable设置为false。

复制:我在运行code from this article时遇到了完全相同的问题,无需修改,其中包括android:focusable =“false”。我在该示例中使用了很多代码,如果我可以使用该代码库,我确信我可以在我的代码库中使用它。

Current UI

3 个答案:

答案 0 :(得分:4)

你错过了我打赌的XML中的一行。

你需要在xml中使用这两行(第二行是最重要的):

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

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分: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修饰符,否则会出现编译错误。