2012-04-21 136 views
12

我在活动的根级别上有一个ViewPager。嵌套Android ViewPager,在ListView中水平滑动ListItems水平

寻呼机的每个页面都包含一个ListFragment(由FragmentPagerAdapter支持)。

一些列表视图中的项目应另外含有ViewPagers支持滑动这些项目的内容(例如一个列表项内的水平廊道)。

如何嵌套查看传呼机? ViewPager - > ListView控件(在页面) - > ViewPager(内部列表项)

我可以ListFragments之间水平滑动,我可以垂直轻扫全名单,但我不能内部列表项刷卡。

回答

0

你不能将需要相同的手势真的窝元素来控制它们。由于视图寻呼机已经捕获了水平运动,所以你的嵌套元素将不会得到它。你可能会做很多工作来通过管理焦点等来解决这个问题 - 但最终你的应用会让用户感到困惑。它最好不要嵌套使用相同交互的元素......在这种情况下,两个观看寻呼机都在观看左右移动。

3

虽然它不是最好的交互设计,有可能通过覆盖dispatchTouchEvent(MotionEvent EV)的根级活动的方法,用requestDisallowInterceptTouchEvent(真)上mainPager和当前的ListView来实现这个防止其他滚动。请看下面的例子:

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 

    Fragment listFragment = getSupportFragmentManager().findFragmentByTag(
      "android:switcher:" + R.id.pager + ":" + (mainPager.getCurrentItem())); 
    mainPager.getChildAt(mainPager.getCurrentItem()); 
    if (listFragment == null) 
     return super.dispatchTouchEvent(ev); 
    ViewPager embeddedPager = (ViewPager) listFragment.getView().findViewById(R.id.videopager); 
    if (embeddedPager != null) { 
     int[] position = new int[2]; 
     embeddedPager.getLocationOnScreen(position); 
     if (ev.getY() > position[1] && ev.getY() < position[1] + embeddedPager.getHeight()) { 
      mainPager.requestDisallowInterceptTouchEvent(true); 
      if (embeddedPager.getScrollX() % embeddedPager.getWidth() != 0) { 
       ListView listView = (ListView) listFragment.getView().findViewById(
         android.R.id.list); 
       listView.requestDisallowInterceptTouchEvent(true); 
      } 
     } 
    } 

    return super.dispatchTouchEvent(ev); 
} 
+0

感谢这个,我修改的想法稍微让你把代码中的其他地方比'活动#dispatchTouchEvent(MotionEvent)'函数,但我用的想法基本上你的:) – 2013-05-08 18:46:33

11

我加入OnTouchListener到内部ViewPager

private OnTouchListener mSuppressInterceptListener = new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(
       event.getAction() == MotionEvent.ACTION_DOWN && 
       v instanceof ViewGroup 
     ) { 
       ((ViewGroup) v).requestDisallowInterceptTouchEvent(true); 
     } 
     return false; 
    } 
}; 

这只是检测在内ViewPager ACTION_DOWN触摸事件,并防止它拦截外一个。因为它返回false,只有ACTION_DOWN事件应该被打中;所有其他事件将被忽略。您可以将此侦听器添加到您希望从外部滚动“保护”的每个元素,但很明显,如果您想要在触摸侦听器内部处理它们时需要处理这些元素的任何其他触摸行为,并且可能会实现一个更好的倾听者。

感谢@Rodja谁给我摆在首位的想法。

+2

哇。更干净。谢谢! – Rodja 2013-05-13 17:17:42

+0

迄今为止最简单的解决方案。 – OcuS 2013-05-28 12:58:44

+1

只是不能相信它有多容易。非常感谢,安德鲁和罗德贾! – 2014-02-15 19:46:00