目标:我正在尝试创建一个每行有2个复选框的UI,每行分成几个部分。我已经在下面列出了UI的截图。
当前的方法:我正在使用ExpandableListView并使用onChildClick处理数据。
问题:当您单击复选框时,它不会触发onChildClick或其他任何内容。单击复选框外的任何位置都会触发此事件。
研究:有很多线程建议设置android:focusable =“false”,但这对我没有任何改变。对于UI中的每个元素,我都将focusable设置为false。
复制:我在运行code from this article时遇到了完全相同的问题,无需修改,其中包括android:focusable =“false”。我在该示例中使用了很多代码,如果我可以使用该代码库,我确信我可以在我的代码库中使用它。
答案 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
修饰符,否则会出现编译错误。