【问题标题】:ListView OnItemClickListener Not Responding?ListView OnItemClickListener 没有响应?
【发布时间】:2011-01-23 00:01:21
【问题描述】:

我到处寻找解决方案,但我不知道如何实现它。我的OnItemClickListener 在我的ListView 行上以某种方式被禁用,因为我在行布局中有一个ImageButton,它接管了焦点。我发现了很多问题,但没有一个问题能帮我解决问题。

我已经检查了this 的问题,但我无法真正确定它的正面或反面。我只需要一种方法来获取可点击的行,这样我就可以检测到何时按下了一行。长按和对焦可以正常工作。

【问题讨论】:

    标签: java android listview


    【解决方案1】:

    OnClickListener 添加到从适配器返回的每个视图中,而不是 OnItemClickListener。您需要使用setItemsCanFocus 设置您的列表:

    ListView list = (ListView) findViewById(R.id.myList);
    list.setAdapter(new DoubleClickAdapter(this));
    list.setItemsCanFocus(true);
    

    然后在您的 AdaptergetView 中,这将产生一个可点击的行。假定按钮位于膨胀的 xml 中。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = View.inflate(context, R.layout.cell, null);
        view.setClickable(true);
        view.setFocusable(true);
        view.setBackgroundResource(android.R.drawable.menuitem_background);
        view.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                new AlertDialog.Builder(context).setTitle("touched").show();
            }
    
        });
        return view;
    }
    

    【讨论】:

    • 别忘了回收视图!使用 convertView,不要每次都膨胀一个新的。
    • 我基本上已经做到了,尽管我觉得我在做某事时遇到了问题。我会再试一次,也许这只是一个愚蠢的错误。
    • 好的,谁能解释一下为什么 ListView 控件没有像宣传的那样工作?我也遇到过同样的问题,虽然触摸响应时间不好,但此解决方案有效。
    • 我知道的老问题,但您也可以在适配器的“newView”方法中创建 onclicklistner。这将保存每次用户滚动列表时调用的此过程
    • 如果您仍然希望整行可点击,这不是一个理想的解决方案,您应该使用stackoverflow.com/a/4518810/9636
    【解决方案2】:

    设置ImageButton的属性:

    android:focusable="false"
    

    因为AbsListView.onTouchEvent 检查child.hasFocusable()

    【讨论】:

    • 非常适合 TextViews。对于 Button 来说,情况并非如此。
    • 如果你使用 android:inputType 作为 textview,你也应该删除它。
    • 比获奖答案更好的选择。注册一个监听器,并处理它。启动内存更少。
    • 我已经坚持了 6 个小时了,我真的需要帮助。 stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
    • 添加另一个发现 - 不要使用“视图”小部件,使用 ImageView 或适用时
    【解决方案3】:

    我已经在 SDK 级别 8 和 16 上测试了以下解决方案。

    getView()

    setFocusable(false);
    setClickable(false);
    

    而不是在适配器的 getView() 中将它们设置为 true,而是按照我认为原始问题想要的方式进行,这意味着如果 OnClickListener 未在 getView() 中设置,则会调用 OnItemClickListener

    我假设您可以在 View 的 OnClickListener 中执行的任何操作都可以在 ListViewOnItemClickListener 中轻松执行。 (视图上的setOnClickListener 隐式地将视图设置为可点击,这显然可以防止ListView 对应的OnItemClickListener 被调用。)

    ImageButton 在项目被按下或翻转时的视觉状态而言,行为与预期的一样。

    解决方案有点错觉,因为它是被按下的列表项而不是ImageButton 本身,所以如果按钮没有占据整个列表项,单击项目中的其他位置仍然会使按钮可绘制状态反映点击。对焦也一样。这可能是值得付出的代价。

    【讨论】:

    • 如果您的 ListView 行有多个可点击项,您可以通过在顶级列表项布局上设置 android:descendantFocusability="blocksDescendants" 而不是在您的视图上设置 OnClickListener 来实现您想要的从 getView() 返回。在单个项目上设置 OnClickListeners 仍然有效。
    • 这个解决方案也对我有用。在我的情况下,当单击 RadioButton 时,我没有在 OnItemClickListener 中获得单击事件。
    • 我已经坚持了 6 个小时,我真的需要帮助。 stackoverflow.com/questions/35108940/why-cant-i-remove-an-item/…
    【解决方案4】:

    这肯定会奏效。将此添加到布局定义中。

    android:descendantFocusability="blocksDescendants" 
    

    找到解决方案here

    【讨论】:

      【解决方案5】:

      为每个视图设置OnClickListener 的另一种方法是不使用ImageButton - 改用ImageViewImageView 仍然可以将事件发送到 OnClickListener 并且不会接管焦点。

      【讨论】:

        【解决方案6】:

        最好的方法是:

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

        Imagebutton 设置这些属性并尝试。 我

        【讨论】:

          【解决方案7】:

          对于我这个问题的版本,问题是我将我的TextView 对象设置为android:inputType="textMultiLine"。当我删除这一行时,列表不可点击的问题就消失了。看起来像个讨厌的小虫子。

          另外,我仍然可以毫无问题地使用android:minLines/android:maxLines 属性,所以这不是什么大问题。只是不是我期望的解决方案。

          【讨论】:

          【解决方案8】:

          以下行解决了我项目中的问题:

          <TextView ... android:textIsSelectable="false" />
          

          【讨论】:

            【解决方案9】:

            作为对我有用的替代解决方案,您可以尝试从 BaseAdapter 扩展您的适配器(iso 实现 ListAdapter 接口)

            【讨论】:

              【解决方案10】:

              把这个代码 ImageView nextpage= (ImageView)findViewById(R.id.btnEdit); 代替 ImageButton 。现在列表项处于活动状态

              【讨论】:

                【解决方案11】:

                我在布局定义中对@9​​87654321@ 和setFocusable="false" 进行了子分类,但对我不起作用。它解决了在子类的构造函数中调用setFocusable(false)

                【讨论】:

                  【解决方案12】:

                  使用ScrollView 可以阻止onItemClickListener 接收输入。

                  希望这对任何人都有帮助。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2015-06-06
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-12-13
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多