【问题标题】:Android: Checkbox in ExpandableListView not triggering onChildClick even with focusable=falseAndroid:ExpandableListView 中的复选框即使使用 focusable=false 也不会触发 onChildClick
【发布时间】:2012-06-21 19:36:58
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 需要澄清 - 当一个复选框被点击时,你希望它触发复选框的事件和 ELV 行事件?对吗?
  • 我真的不在乎它会触发什么,只要我可以使用该触发来更新数据。所以我想我需要它来触发一些东西,这些东西会给我组、子行和每个复选框的状态。我很确定我可以在 OnChildClick 中获得这些。由于我对这些行中的每一行都使用了相同的 2 个复选框,因此我认为我不能使用侦听器来做到这一点。
  • 在触控模式下一切仍可聚焦。您需要通过添加android:focusableInTouchMode="false" 来关闭它。请参阅下面的答案。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      @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 修饰符,否则会出现编译器错误。

      【讨论】:

      • 我可以在复选框中添加一个 OnClickListener,但据我所知,这不会给我关于单击哪个复选框的信息,即 AKA 组和子项。至于提交,我希望只处理每个支票更改而不需要提交。
      • 如果您将 OnClickListener(匿名类)添加到 getView() 中的复选框,您将在那里捕获局部变量,如位置、convertView 等。因此您可以访问您当前所在的项目.
      • 现在正在使用演示应用程序实现这一点。
      • 我有理由确定我实现了一个匿名侦听器,但它无法访问任何外部变量:cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Log.d("ElistCBox2", groupPosition); } }); 抱歉格式化,这些 cmets 非常简单。
      • 我在我的帖子中添加了一个包含您的代码的代码示例。我希望它有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-02
      • 2021-12-26
      相关资源
      最近更新 更多