LoginSignup
10
10

More than 5 years have passed since last update.

ViewPagerで,アイテムが選択されたときにコールバックを受ける

Posted at

ViewPager#OnPageChangeListenerではダメなことが

一番最初に思いつくのが, ViewPager#OnPageChangeListener.onPageSelected(int position) なんですが, setAdapter直後 は呼ばれません.
StackOverFlow - onPageSelected doesn't work for first page

そのため,setAdapterしたら,カレントのアイテムを確認して操作したいとか,表示を変更したいということができません.

Adapter側にコールバックを作る

PagerAdaptersetPrimaryItem(ViewGroup container, int position, Object object) がありますので,これを用いるようにします.

MyPagerAdapter.java
private int mLastActionedPrimaryItemPosition = -1;
public class MyPagerAdapter extends PagerAdapter {
   @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        if (mLastActionedPrimaryItemPosition != position) {
            if (mListener != null) {
                mListener.onPageSelected(container, object, position);
            }
            mLastActionedPrimaryItemPosition = position;
        }
    }

    public interface OnCurrentItemChangeListener {
        void onPageSelected(@NonNull ViewGroup container, @NonNull Object object,
                int position);
    }
}
MyActivity.java
@Override
public void onCreate(~) {
  final ViewPager viewPager = ~;
  viewPager.setAdapter(new MyPagerAdapter(new OnCurrentItemChangeListener() {
    @Override
    void onPageSelected(@NonNull ViewGroup container, @NonNull Object object,
                int position) {
      // ここに処理を書く
  }));
}

ただ,この setPrimaryItem は,レイアウト計算が走るたびに呼ばれますので, 1度だけ呼ばれるとは限りません.
そのため,setPrimaryItemでは,メンバでキャッシュしている mLastActionedPrimaryItemPosition の値が変わったらコールバックを呼び出すようにします.

Thanks!

Android Slackグループ のみなさま
知恵を貸して頂きありがとうございました.

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10