17

メソッド getPageWidth を上書きして 0.3f を返すカスタム PagerAdapter を備えた ViewPager があるため、次のブログで提案されているように、画面に複数のページを表示できます。

http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html

In this case the ViewPager starts empty and the user starts filling the pages (images) as requested. The images are filled from left to right. All is working fine and the pages are dinamically created, and it is easy to swipe between them when there are multiple images.

However there is a problem when there are less than three pages instantiated. A swipe gesture from right (no content) to left produces a flickering with pages moving from left to right alternatively, as if the ViewPager were trying to move the first pages to right but later turning to its original position. This happens during the whole gesture, and stop when leaving the gesture. As I said this does not happen when there are pages enough to cover the whole screen width and a real scroll is necessary.

Any Ideas?

4

3 に答える 3

12

これは古い質問であることは知っていますが、解決策を探していて、このリンクに出くわしました(奇妙にこの質問を参照しています)。とにかく、彼らのコメントに基づいて解決策を見つけることができました。基本的な考え方は、設定したブール値フラグの状態に基づいてタッチ イベントを許可することです。

  1. オーバーライド onInterceptTouchEvent と onTouchEvent で ViewPager を拡張して、フラグを設定した場合にのみ super を呼び出します。私のクラスは次のようになります。

    public class MyViewPager extends ViewPager {
    
        private boolean isPagingEnabled = false;
    
        public MyViewPager(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyViewPager(Context context) {
            super(context);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event) {
            if (isPagingEnabled) {
                return super.onInterceptTouchEvent(event);
            }
            return false;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (isPagingEnabled) {
                return super.onTouchEvent(event);
            }
            return false;
        }
    
        public void setPagingEnabled(boolean pagingEnabled) {
            isPagingEnabled = pagingEnabled;
        }
    }
    
  2. レイアウト xml で、com.android.support.v4.ViewPager 要素を com.yourpackage.MyViewPager 要素に置き換えます。

  3. ページャー アダプターの getPageWidth() から 0.3f を返すため、4 番目のアイテムが追加されたときにスクロールを有効にする必要があります。注意が必要なのは、ページャー アダプターを定義し、アダプターのバッキング リストからオブジェクトを追加または削除するときに、このコード行がいたるところにあることです。

    mPager.setPagingEnabled(items.size() > 3);
    
于 2013-09-23T07:13:36.003 に答える
1

getPageWidth() メソッドで、この方法で解決できました。画像が 1 つしかない場合 [配列または配列リストのサイズを確認することで知ることができます] 1 を返します。入力サイズが 1 より大きい場合は、10 進数を返します。 . これを実現するコードは次のとおりです。

@override
public float getPageWidth(int position){
  if(inpputsize==1){ 
      return 1.0;
  }
  return 0.9;  
}
于 2015-06-16T04:44:15.863 に答える