2011-01-01 4 views
5

目的は、アダプタがListViewを返すギャラリーを実装することです(つまり、水平方向にスクロールするギャラリーに埋め込まれたListViewを垂直方向にスクロールすること)。それは仕事のビットの後に並べ替えられますが、水平にスクロールしようとすると、ListViewは非常にジッタがあります。私はギャラリーに埋め込まれた他のタイプのビューでこの種の動作を観察していません。ここでGallery内にリストビューを埋め込む

は、私が試したものです:

を最初に、私はListViewコントロールはタッチイベントを押しつぶしことがわかったので、ギャラリーにジェスチャーリスナーは解雇れることは決してありません。 ListViewコントロールが膨張して構成された後、ギャラリーアダプタのgetViewメソッド()メソッドの内部で、次に

galleryGestureDetector = new GestureDetector(this, gallery);

だから活動ののonCreate()メソッドでは、私がGestureDetectorを作成しました私もリストビューのonTouchEvent()メソッドが実際に呼び出されないことを確実にするためにOnTouchListenerからtrueを返すの極端なステップに行っている。この場合

listView.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     galleryGestureDetector.onTouchEvent(event); 
     return true; 
    } 
}); 

:、私はこのようないくつかのコードを持っています。同じ不安定な動作が発生します。結果として、私は2つのビューの間で競合するonTouchEvent()実装を除外することができると思う。

TouchDelegateの概念を悪用しようとしましたが、ギャラリーのタッチ矩形を拡張してListViewを含むようにしてから、ListViewにそれを委任しましたが、これは無駄な努力でした。

私は手を投げて、それは現時点では不可能だと言いますが、DroidXでパックされているソーシャルネットワーキングアプリは何とかそれを達成しています!

+0

ギャラリーがレンダリングされるたびにリストビューがたくさんのビューを作成/膨張させていないかどうかを確認することがあります。それが問題であるかどうかを確認するために、キャッシングを試みてください(またはただ1つの静的フィールドを使用してください)。 – monkjack

+0

良い考えのモンクジャック、実際には、ギャラリーが選択から外れた後にアダプタから返されたListViewをリサイクルしていたようです。私は、あなたが提案したようなビューをキャッチしようとしました.3つの要素のうち、3つのビューだけが膨らんでいるというこの問題の解決方法をテストするために使用している要素を確認しました。残念ながら、私は同じ結果を見ています...ビューが少々スライドすると、狂ったようにジッタがかかり始めます。 – jkschneider

+0

さらに不思議なことに、私は、ListViewがジッタを起こした後でも水平方向にスクロールしようとすると、ギャラリーが時には2つのビュー間でスタックすることに気付きました。 – jkschneider

答えて

5

問題は、ListViewがギャラリーからのタッチイベントをインターセプトしてから、ビューの位置自体を変更することです。これは、私がウィジェットをそのまま使用するときに見られる前後のジッタ効果につながります。私はギャラリーウィジェットでこのバグを検討したが、その間に、それはこのようにギャラリーをサブクラス化することで固定することができます。

public class BetterGallery extends Gallery { 
private boolean scrollingHorizontally = false; 

public BetterGallery(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

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

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

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    super.onInterceptTouchEvent(ev); 
    return scrollingHorizontally; 
} 

@Override 
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
    scrollingHorizontally = true; 
    return super.onScroll(e1, e2, distanceX, distanceY); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    switch(event.getAction()) { 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_CANCEL: 
     scrollingHorizontally = false; 
    } 

    return super.onTouchEvent(event); 
} 

}

あなたはギャラリーの代わりにBetterGalleryを使用する場合は、全部がただ作品元気?