LoginSignup
39
37

More than 5 years have passed since last update.

ViewPagerでこれから表示しようとするViewやItemの取得にはsetPrimaryItem()を。

Last updated at Posted at 2015-10-07

初投稿です。ドキドキ
ブログのほうにちょろちょろ書いていましたが、ハマったところのエッセンスだけここに残せればと思います。

ViewPagerでこれから表示しようとするViewをいじりたい

普通にinstantiateItem()でやれば?

そういう考え方もありますね。
ただ、タッチイベント系のライブラリを組み合わせる場合、
前後のアイテムを先読みするので、複数のViewにセットされてしまうことで不具合が生じる場合があります。
たとえば、PhotoViewとか

どうしたいの?

表示するときにセットして、次のViewに移るとき外す、を繰り返したい。

それを実現するのが

setPrimaryItem()メソッド
PagerAdapterクラスのメソッドです。
アブストラクトメソッドではないので、見落としがちです。
FragmentPagerAdapterで現在表示中のFragmentを取得....という場合でも使われている、よくできる子。
この子をオーバーライドするして、自分好みに変化させます。

どうつかうの?

instantiateItem()でアイテムをセットするときに、inflateするときのViewにいじりたいViewをsetTag()しておきます。
setPrimaryItem()で前の要素にセットしていたものを外し、これから表示するものをgetTag()して取得して、いじる!

コードのイメージはこんな感じ。

ImagePageradapter

    @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が表示されている間だけ何かしたいという時に有用かと思います。

39
37
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
39
37