8

ビューページャーを使用する必要があるアプリケーションを開発しています。ビューページャーのすべてのアイテムが終了したら、アクティビティを呼び出す必要があります。このイベントリスナーを取得できません。これも私が参照しているものです: https://github.com/chiuki/android-swipe-image-viewer/blob/master/src/com/sqisland/android/swipe_image_viewer/MainActivity.java

これが私がこれまでに行ったことです:

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
    ImagePagerAdapter adapter = new ImagePagerAdapter();
    viewPager.setAdapter(adapter);

    OnPageChangeListener mListener = new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            Log.i("Doing something here", "On Scroll state changed");
        }
    };
    viewPager.setOnPageChangeListener(mListener);

}

private class ImagePagerAdapter extends PagerAdapter {
    private int[] mImages = new int[] { R.drawable.libin1,
            R.drawable.libin2 };

    @Override
    public int getCount() {
        return mImages.length;

    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((ImageView) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Context context = MainActivity.this;
        ImageView imageView = new ImageView(context);
        int padding = context.getResources().getDimensionPixelSize(
                R.dimen.padding_medium);
        imageView.setPadding(padding, padding, padding, padding);
        imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        imageView.setImageResource(mImages[position]);
        ((ViewPager) container).addView(imageView, 0);
        return imageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((ImageView) object);
    }
}
}

私の質問は、viewpager のすべての項目が終了した場合にイベント リスナーを取得する方法です。

4

6 に答える 6

19
private OnPageChangeListener mListener = new OnPageChangeListener() {

    @Override
    public void onPageSelected(int arg0) {
        // TODO Auto-generated method stub
        selectedIndex = arg0;

    }
    boolean callHappened;
    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub
        if( mPageEnd && arg0 == selectedIndex && !callHappened)
        {
            Log.d(getClass().getName(), "Okay");
            mPageEnd = false;//To avoid multiple calls. 
            callHappened = true;
        }else
        {
            mPageEnd = false;
        }
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub
        if(selectedIndex == adapter.getCount() - 1)
        {
            mPageEnd = true;
        }
    }
};
ViewPager.setOnPageChangeListener(mListener);

onPageScrolledまたはonPageSelectedこれらのいずれかをここで使用して、選択したページが 内のアイテムの数と等しいことを確認することもできますViewPager

于 2013-04-11T05:20:39.913 に答える
3

これら 3 つのコールバックは次のように機能します。

  • onPageScrollStateChanged は状態 ViewPager.SCROLL_STATE_DRAGGING で呼び出されます
  • onPageScrolled は何度も呼び出され、そのパラメーター positionOffset と positionOffsetPixels は増加し続けます
  • onPageScrolled のパラメータ positionOffset が 0.5 を超える場合、onPageScrollStateChanged が状態 SCROLL_STATE_SETTING で呼び出されます
  • onPageSelected は、次のページ インデックスを位置として呼び出されます
  • onPageScrolled は何度も呼び出され、そのパラメーター positionOffset と positionOffsetPixels は増加し続けます
  • onPageScrolled のパラメータ positionOffset は 1 であり、onPageScrollStateChanged は状態 SCROLL_STATE_IDLE で呼び出されます

ロジックは onPageSelected と onPageScrollStateChanged に入れるべきではありません。それらを使用すると、状態が変更されたことしかわからないからです。onPageScrolled でのみ方向を取得できます。したがって、私の実装は次のようになります。

        private int selectedPageIndex = -1;
        private boolean exitWhenScrollNextPage = false;

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            if (exitWhenScrollNextPage && position == PAGE_COUNT - 1) {
                exitWhenScrollNextPage = false; // avoid call more times
                AndroidLog.error("-------- YEAH!");
            }
        }

        @Override
        public void onPageSelected(int position) {
            selectedPageIndex = position;
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            if (state == SCROLL_STATE_IDLE) {
                exitWhenScrollNextPage = selectedPageIndex == PAGE_COUNT - 1;
            }

        }
于 2015-10-31T18:36:20.543 に答える
1

Triode さん、すばらしい回答をありがとうございます。

あなたが私のプロジェクトに投稿したコードを使用しました。私の場合、ユーザーが最後のフラグメントを右にスワイプすると、アクティビティが終了します。正常に機能しましたが、右にスワイプする代わりに左にスワイプすると、まだアクティビティが終了していました。

私はあなたのコードを変更しadapter.getCount() - 1selectedIndex. この場合、ユーザーが左にスワイプしてもアクティビティは終了しません。

if( mPageEnd && arg0 == adapter.getCount()-1 && !callHappened){
    Log.d(getClass().getName(), "Okay");
    mPageEnd = false;//To avoid multiple calls. 
    callHappened = true;
}else{
    mPageEnd = false;
}
于 2015-06-26T19:24:20.510 に答える
0
@Override
public void onPageScrolled(int pageScrolledOn, float positionOffset, int positionOffsetPixels) {

            if(positionOffset == 0F){
                // meaning you cannot scroll further in current scroll direction

                int lastPage = viewPagerAdapter.getCount - 1;
                if (pageScrolledOn == lastPage){

                    //scroll on last page has occured
                    scrolledOnLastPage = true;
                }
            }

        }
于 2015-10-05T19:05:29.447 に答える