【问题标题】:How to implement onTouchListener to an item of listview without effecting scrolling如何在不影响滚动的情况下将 onTouchListener 实现到列表视图项
【发布时间】:2014-11-11 00:18:06
【问题描述】:

我的 Main Activity 中有一个列表视图,其中包含完整尺寸图像的列表。我正在尝试在列表视图的图像视图上实现 onTouchListener 以获取用户触摸的点。我通过在自定义适配器的 get View 方法中实现 onTouchListener 来获得正确的列表视图。但是当我触摸屏幕滚动列表时,它仍然会在滚动列表时给我积分。但我不想在滚动列表时调用 onTouchListener。我该怎么做。

【问题讨论】:

    标签: android listview ontouchlistener custom-adapter


    【解决方案1】:

    你可以试试这个,这可能有用

        float posX, posY;
        imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN){
                posX = event.getX();
                posY = event.getY();
            }
            if (event.getAction() == MotionEvent.ACTION_UP){
                if (((posX >= event.getX() && posX <= event.getX() + 10) || (posX <= event
                            .getX() && posX >= event.getX() - 10))
                            && ((posY >= event.getY() && posY <= event.getY() + 10) || (posY <= event
                                    .getY() && posY >= event.getY() - 10))){
                    //Do your thing
                }
            }
            return true;
        }
        });
    

    【讨论】:

    • 我试过这个。它使 onScroll 工作正常,但是当我触摸屏幕时不滚动它有时显示点,有时不显示。
    • 这是我的设备的故障,在模拟器上测试过。这个解决方案非常适合我的情况。非常感谢你。投票并标记为答案。
    • 抱歉,我之前的编辑逻辑完全错误
    • ACTION_UP 和 ACTION_DOWN 事件并非每次都在同一位置发生,所以这就是它偶尔使用以前的代码的原因,但我更改了条件逻辑,以便它仅在 ACTION_DOWN 位置位于范围内时返回 true在 x 和 y 方向上超过 10 个单位的 ACTION _UP 事件的 10 个单位,即当滚动到超过 10 个单位时,它返回 false。
    • if (Math.abs((posY - event.getY()))
    【解决方案2】:

    我认为正确的方法是实现onClickListener 而不是onTouchListener

    是的,原因是当用户只打算滚动 ListView 时,View 将被触摸。

    【讨论】:

      【解决方案3】:

      覆盖此方法并根据您的要求完成。

      @Override
          public boolean onInterceptTouchEvent(MotionEvent ev) {
      
              if (isScrooling) {
                  return super.onInterceptTouchEvent(ev);
              } else {
                  return false;
              }
          }
      

      【讨论】:

      • 我在哪里添加这个覆盖方法?
      • 编写一个扩展 ListView 的类并覆盖方法并为 isScrooling 放置 setter 和 getter 并处理它。
      • 编写 CustomListiew 类扩展 ListView 并覆盖此方法,并将此 CustomListiew 放置在您的 xml 布局中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多