2012-03-23 4 views
6

私は、ページのためにGridViewを使用するViewPagerを持っています。画面全体をスワイプするとViewPagerがページを切り替えるようにしたいと思います。AndroidのViewPager内に配置されたGridView上のスワイプを正しく検出します。

問題は、スワイプがGridViewを越えて作成されたときに検出されないことです。 GridViewの外では、スワイプは正しく機能します。 GridViewは最初にViewPagerに渡さずにすべてのタッチイベントをトラップしているようです。

ソースコードをいじるが、私は、GridViewコントロールから拡張するカスタムクラスにこれをした:

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return pager.onInterceptTouchEvent(event); 
} 

からpagerはViewPagerクラスを指します。これにより、ViewPagerはスワイプを正しく検出し、それに応じてページを移動しますが、GridViewではイベントを受け入れることができないため、アイテムをクリックできません。

ViewPagerのスワイプとGridViewのアイテムのクリックを正しく検出することができたらいいですか?

+0

これには解決策がありましたか? – Praneeth

答えて

1

あなたはアリックスは正しい軌道に乗っている

2

たいディスパッチevenementためonInterceptTouchEvent上書きすることができます。私はこのシンプルな修正を思いつきました。私はそれがどのように動作するかについて完全には分かっていませんが、それはあります!将来のリファレンスとして、GridViewだけでなく、TableLayoutなど、他の種類のビューでも機能します。

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    x = event.getX(); 
    y = event.getY(); 
    switch (event.getActionMasked()) { 
    case MotionEvent.ACTION_DOWN: { 
     downX = x; 
     downY = y; 
     return super.onInterceptTouchEvent(event); 
    } 
    case MotionEvent.ACTION_MOVE: { 
     deltaX = Math.abs(downX - x); 
     deltaY = Math.abs(downY - y); 
     return super.onTouchEvent(event); 
    } 
    case MotionEvent.ACTION_UP: { 
     if (deltaX > 4 && deltaY > 4) { 
      super.onTouchEvent(event); 
     } 
    } 
    } 
    return super.onInterceptTouchEvent(event); 
} 
+0

それは完璧な、仕事です。答えは解決済みと記入してください。私のために – olegflo

+0

それは動いているだけです!下に移動すると動作しません – Praneeth

+0

これは私のためにうまく動作しますが、私はグリッド項目をクリックすることができません。なにか提案を? – AndroGeek

6

私はcoligの実装に問題があったが、私はそれがViewPagerをサブクラス化し、onInterceptTouchEvent()メソッドをオーバーライドすることにより、仕事を得ることができました。必要に応じて垂直方向のスクロールを可能にするためにX方向のスワイプのみをチェックしました。

private static final int minSwipeDistance = 30; 
private float mTouchX; 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    boolean response = super.onInterceptTouchEvent(event); 
    float x = event.getX(); 
    switch (event.getActionMasked()) { 
    case MotionEvent.ACTION_DOWN: 
     mTouchX = x; 
     break; 
    case MotionEvent.ACTION_MOVE: 
     float dX = Math.abs(x - mTouchX); 
     if (dX > minSwipeDistance) 
      return true; 
     break; 
    } 
    return response; 
} 
関連する問題