ギャラリー内のリストビューを埋め込みます
-
14-10-2019 - |
質問
目標は、アダプターがListViewsを返すギャラリーを実装することです(つまり、水平方向にスクロールギャラリーに埋め込まれたリストビューを垂直にスクロールする)。ちょっとした作業の後に機能しますが、水平にスクロールしようとすると、ListViewは中心に粘着性があるように非常に不安に見えます。ギャラリーに埋め込まれた他の種類のビューで、この種の動作を観察していません。
これが私が試したことです:
当初、ListViewがタッチイベントを押しつぶすことがわかったので、ギャラリーのジェスチャーリスナーは解雇されることはありませんでした。
したがって、アクティビティのOnCreate()メソッドでは、GestureDetectorを作成しました。
galleryGestureDetector = new GestureDetector(this, gallery);
次に、ギャラリーアダプターのgetView()メソッド内で、ListViewが膨らんで構成された後、次のようなコードがあります。
listView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
galleryGestureDetector.onTouchEvent(event);
return true;
}
});
この場合、私はontouchListenerから真の極端なステップに進み、listViewのontouchevent()メソッドが実際に呼び出されることはないことを確認しました。同じ不安定な動作が発生します。その結果、2つのビュー間で競合するOntouchevent()の実装を除外できると思います。
ギャラリーのタッチ長方形を拡張してListViewを含めることで、TouchDelegateのコンセプトを乱用してから、ListViewを強制的に委任しましたが、これも無駄な努力でした。
私は手を伸ばして、それは現在可能ではないと言いますが、Droidxを詰め込んだソーシャルネットワーキングアプリはどういうわけかそれを達成します!
解決
問題は、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を使用する場合、全体がうまく機能します!