2012-04-21 140 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