ViewPager#OnPageChangeListenerではダメなことが
一番最初に思いつくのが, ViewPager#OnPageChangeListener.onPageSelected(int position)
なんですが, setAdapter直後 は呼ばれません.
StackOverFlow - onPageSelected doesn't work for first page
そのため,setAdapterしたら,カレントのアイテムを確認して操作したいとか,表示を変更したいということができません.
Adapter側にコールバックを作る
PagerAdapter
に setPrimaryItem(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グループ のみなさま
知恵を貸して頂きありがとうございました.