【问题标题】:OnItemClickListener doesn't work with ListView item containing buttonOnItemClickListener 不适用于包含按钮的 ListView 项目
【发布时间】:2012-01-14 20:47:33
【问题描述】:

我有ListView 和自定义Adapter,它以这种方式将View 提供给ListView

   public View getView(int position, View convertView, ViewGroup parent)
   {
        RelativeLayout.LayoutParams lineParams;
        RelativeLayout line=new RelativeLayout(context);

        TextView tv=new TextView(context);
        tv.setText("Text in postion="+i);
        lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        lineParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
        line.addView(tv, lineParams);
        lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);

        //checkbox
        CheckBox checkBox=new CheckBox(context);
        lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        lineParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
        line.addView(checkBox, lineParams);
        return line;
    }

ListView 内部的某个地方有setOnItemClickListener(),它应该拦截项目点击事件。我的问题是,每当我尝试将复选框添加到项目时 - 我的ListView 没有任何回应。如果我跳过CheckBox 或任何其他Button 它可以工作。

我真的被这个问题困住了,我尝试了各种布局,对齐,换行等等 - 没用。看起来CheckBox 干扰了ListView 项目点击事件。

任何想法如何克服?

【问题讨论】:

    标签: android listview button adapter onitemclicklistener


    【解决方案1】:

    只需将此行添加到项目视图中,而不是 listView 本身

    android:focusable="false"
    

    Android custom ListView unable to click on items查看更多详情

    【讨论】:

    • 没用!还有其他选择吗?
    • 好的,我想通了——它有效。我需要将 setFocusable(false) 用于项目视图而不是 listView 本身。谢谢!
    • 如果在窃取焦点的视图上设置可聚焦 false 确实有效 - 在这种情况下是复选框或按钮。
    • 如果每一行都有 textview 则确保 textIsSelectable 设置为 false
    • 在我的适配器中,我设置了btn.setFocusable(false),它解决了这个问题。我认为 Android 在加载 XML 后将 focusable 设置为 true。
    【解决方案2】:

    如果列表项中有ImageButtons,则需要添加:

    android:descendantFocusability="blocksDescendants"
    

    到根列表项元素[例如根布局]。

    然后在列表项中的每个ImageButton内,需要添加:

    android:focusableInTouchMode="true"
    

    这对我有用 - 但我使用的是 ImageButtons,而不是标准按钮。

    【讨论】:

    • 完美 :-) 谢谢
    【解决方案3】:

    我也遇到了同样的问题,我尝试将 android:focusable="false" 设置为 listview,但它不起作用,然后我将其添加到 listview 项目中。就像在我的 listview 项目中,我使用了造成问题的切换按钮,我将android:focusable="false" 添加到切换按钮和列表视图上的项目单击侦听器再次开始工作

    【讨论】:

      【解决方案4】:

      将以下行添加到您的 listView

      android:choiceMode="singleChoice"
      

      或确保在布局文本字段中设置以下行

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

      【讨论】:

        【解决方案5】:

        我的 ListView 中也有一个按钮的问题。不幸的是,仅将适配器中所有对象的焦点设置为 false 对我不起作用。

        我现在有一个解决方法。

        如果您还没有这样做,请在您的适配器中为按钮(或其他可点击对象)创建一个 OnClickListener。在该 OnClickListener 中,您自己调用 OnItemClickListener。

        public void onClick(View v) {
            mOnItemClickListener.setOnItemClick(mListView, v, vPos, vId);
        }
        

        这确实意味着您需要让适配器访问父 ListView 和 OnItemClickListener。

        【讨论】:

          【解决方案6】:

          您可以考虑在您的列表视图项中编写 onOnTouchEvent 并将正确的 touchEvent 发送到您的子视图,即按钮。

          【讨论】:

            【解决方案7】:

            好吧,我知道上述解决方案都不起作用。我尝试更改 xml 属性,但这些都不起作用,但我以一种新的方式实现了它。 方法如下:

            使用方法onCheckBoxChecked 创建一个接口 CheckBoxOnCheckListener 并传递所需的参数,在您的活动片段 中实现接口CheckBoxOnCheckListener包含 listView

            接下来在您的适配器中,将mListener 声明为CheckBoxOnCheckListener,并将其作为参数从fragment/activity 传递给适配器的构造函数,并将其转换为CheckBoxOnCheckListener 并分配给mListener

            接下来将mListener设置为itemView.onClickCheckBox.onCheckCheckedListeneronCheckChanged方法调用mListener.onCheckBoxChecked

            就是这样。它肯定会起作用,它对我有用。 代码只需 pm。

            【讨论】:

              【解决方案8】:

              如果您在Activity 中使用ListView,请确保您已设置setOnItemClickListener()

              myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多