【问题标题】:Android Listview inside ViewPager, No horizontal swipeViewPager中的Android Listview,没有水平滑动
【发布时间】:2016-02-09 14:52:48
【问题描述】:

我有一个活动持有一个viewpager。 viewpager 中的片段之一包括一个几乎覆盖整个屏幕的列表视图,但只能被动地显示项目(无需点击项目)。

我已经尝试了在 SO 上找到的几个选项来禁用对列表视图的点击和/或它的适配器或构建不消耗列表视图/适配器的点击等的侦听器,但没有一个解决我的问题:

当列表视图充满项目时,我必须在显示的最外边界滑动才能移动到视图页面的另一个片段。例如,在其他片段上,我没有列表视图,但有其他视图,例如地图,并且可以在直接在显示器中间进行滑动手势时在片段之间滑动。

为了获得一致的用户体验,我还希望在持有被动列表视图的片段上具有这种行为。

谢谢。

【问题讨论】:

  • 考虑使用 RecyclerView。 ListView 不再是滚动列表的最佳选择。

标签: android listview android-viewpager


【解决方案1】:

通过扩展创建自定义 ViewPager 并实现 dispatchTouchEvent。

我们开始跟踪ACTION_DOWN 中的触摸(屏幕上的像素位置)。当我们看到它是水平滑动时,我们不调用 super.dispatchTouchEvent( event ) - 这将执行默认的 onTouch 路由并使某些子视图也消耗水平滑动 - 但在 ACTION_MOVE 和 @987654325 中调用 onTouchEvent( event ) @。

public class MyViewPager extends ViewPager {

private float mLastX;
private float mLastY;
private final int mTouchSlop = ViewConfiguration.get( getContext() ).getScaledTouchSlop();
private float mStartX;

public MyViewPager( Context context ) {
    super( context );
}

public MyViewPager( Context context, AttributeSet attrs ) {
    super( context, attrs );
}

@Override
public boolean dispatchTouchEvent( MotionEvent event ) {
    switch( event.getAction() ) {
        case MotionEvent.ACTION_DOWN:
            mLastX = event.getX();
            mLastY = event.getY();
            mStartX = event.getX();
            break;
        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            onTouchEvent( event );
            break;
        case MotionEvent.ACTION_MOVE:
            float x = event.getX();
            float y = event.getY();

            float xDelta = x - mLastX;
            float xDeltaAbs = Math.abs( xDelta );
            float yDeltaAbs = Math.abs( y - mLastY );

            float xDeltaTotal = x - mStartX;
            if( Math.abs( xDeltaTotal ) > mTouchSlop )
                if( xDeltaAbs > yDeltaAbs )
                    return onTouchEvent( event );
    }

    return super.dispatchTouchEvent( event );
  }
}

【讨论】:

    【解决方案2】:
    public boolean onTouch(View v, MotionEvent e) {
        if(e.getAction() == MotionEvent.ACTION_DOWN){
           listItem.getParent().requestDisallowInterceptTouchEvent(true);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多