2012-04-21 12 views
12

IアクティビティのルートレベルにViewPagerを有します。ネストアンドロイドViewPagerは、リストビュー内のスワイプリストアイテムは、水平

ページャの各ページには、(FragmentPagerAdapterに裏打ちされた)ListFragmentが含まれています。

リストビューアイテムのいくつかは、それらの項目の内容スワイプサポートするようにさらにViewPagersを含むべきである(例えばする。リスト項目内の水平ギャラリー)。

どのようにビューポケットベルをネストできますか? ViewPager - > ListView(ページ内) - > ViewPager(リスト項目内)

ListFragmentsを水平方向にスワイプすることができます。リスト全体をスワイプできますが、リスト項目内をスワイプできません。

答えて

0

あなたは同じジェスチャーを必要とする本当に巣要素は、それらを制御することができません。ビューページャはすでに水平方向の動きをキャプチャしているので、ネストされた要素はそれを取得しません。フォーカスなどを管理することでこの問題を回避するには、おそらく多くの作業を行うことができますが、最終的にはアプリがユーザーにとって混乱することになります。同じインタラクションを使用する要素を入れ子にしないほうがいいです...この場合、2つのビュー・ページャは、サイド・バイ・サイド・モーションを見ています。

3

それが最良のインタラクションデザインではないですが、dispatchTouchEvent(MotionEvent EV)ルートレベルの活動の方法を上書きし、mainPagerと現在のListViewにrequestDisallowInterceptTouchEvent(真)を使用してこれを実現することが可能です他のスクロールを防止します。この例を見てください:

@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)'関数よりも内のコードを入れてみましょうするために、わずかなアイデアを変更しますが、私は使用アイデアは、基本的には、あなたでした:) –

11

私はインテリアViewPagerOnTouchListenerを追加しました:

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イベントだけがヒットするはずです。他のすべてのイベントは無視されます。このリスナーは、外部のViewPagerのスクロールから保護するすべての要素に追加できますが、タッチリスナー内でそれらの要素を処理する必要がある要素で他のタッチ動作を選択する場合は、おそらくより良いリスナを実装するでしょう。最初の場所で私のアイデアを与えた@Rodjaへ

クレジット。

+2

うわー。とても清潔です。ありがとう! – Rodja

+0

はるかに簡単な解決策です。 – OcuS

+1

それがいかに簡単に機能するか信じられません。多くの感謝、アンドリューとロジャ! –

関連する問題