初投稿です。ドキドキ
ブログのほうにちょろちょろ書いていましたが、ハマったところのエッセンスだけここに残せればと思います。
#ViewPagerでこれから表示しようとするViewをいじりたい
##普通にinstantiateItem()でやれば?
そういう考え方もありますね。
ただ、タッチイベント系のライブラリを組み合わせる場合、
前後のアイテムを先読みするので、複数のViewにセットされてしまうことで不具合が生じる場合があります。
たとえば、PhotoViewとか
##どうしたいの?
表示するときにセットして、次のViewに移るとき外す、を繰り返したい。
##それを実現するのが
setPrimaryItem()メソッド
PagerAdapterクラスのメソッドです。
アブストラクトメソッドではないので、見落としがちです。
FragmentPagerAdapterで現在表示中のFragmentを取得....という場合でも使われている、よくできる子。
この子をオーバーライドするして、自分好みに変化させます。
#どうつかうの?
instantiateItem()でアイテムをセットするときに、inflateするときのViewにいじりたいViewをsetTag()しておきます。
setPrimaryItem()で前の要素にセットしていたものを外し、これから表示するものをgetTag()して取得して、いじる!
コードのイメージはこんな感じ。
@Override
public View instantiateItem(ViewGroup container, int position) {
View view = inflater.inflate(R.layout.image_display_view, container,false);
ButterKnife.bind(this, view);
view.setTag(mImageView);//いじりたいViewをsetTag
Picasso.with(mActivity).load(new File(AR.adapter.get(position))).resize(p.x,p.y).centerInside().into(mImageView);
}
container.addView(view);
return view;
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
View view = (View)object;
if(oldImageView!=null){
mAttacher.cleanup();
}
currentImageView = (ImageView)view.getTag();//getTagをつかって取得し、後はいじるだけ。
mAttacher = new PhotoViewAttacher(currentImageView);
oldImageView = currentImageView;
super.setPrimaryItem(container, position, object);
}
##おわりに
setPrimaryItemで現在のViewを保存しておけば、いつ呼ばれるかわからないdestroyItem()よりも確実な破棄の処理が行えます。
ライフサイクルのないカスタムViewなどで、Viewが表示されている間だけ何かしたいという時に有用かと思います。