2016-09-07 16 views
2

は私がViewsないフラグメント)を介してスライドするViewPagerに私のアダプタを表しPagerAdapterを拡張するカスタムクラスを作成しました。PagerAdapterから現在のビューを特定の位置から取得する方法は?

私の問題は実際には、私はそれを使って特定の手順に従うことができるように、私が以前にアダプタに追加している現在のビューを取得する方法を知らないということです。

PagerAdapterは、を返すinstantiateItem(ViewGroup container, int position)メソッドを提供し、実装ではViewを返します。

これは現在の位置にViewを呼び出すための正しい方法ですか? はいの場合、私はcontainer引数として渡しますか?

ありがとうございます!

参考文献:

SequenceAdapter.java

public class SequenceAdapter extends PagerAdapter { 

private List<View> mList; 

public SequenceAdapter(){ 
    this.mList = new ArrayList<>(); 
} 

public void add(View viewGroup){ 
    mList.add(mList.size(), viewGroup); 
    notifyDataSetChanged(); 
} 

@Override 
public int getCount() { 
    return mList.size(); 
} 

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

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    View view = mList.get(position); 
    container.addView(view, position); 
    return view; 
} 

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

@Override 
public CharSequence getPageTitle(int position) { 
    return null; 
} 

答えて

1

はあなたのPagerAdapterサブクラスは、アダプタ上notifyDataSetChanged()を呼び出し、ListViewに非常に類似しViewPagerで必要なビューをモデル化しています。

ここでそれは変わっています:ViewPagerは、すべての現在のページがどこに行くのかあなたのアダプターに尋ねます。これは、オーバーライドgetItemPosition()に処理されます。 POSITION_NONEを返すとViewPagerにそのページインデックスのビューが無効であることが通知された後、更新されたビューを取得するためにinstantiateItem()が呼び出されます。

既にインスタンス化されているビューを取得しようとするのではなく(ユーザーがいくつかのページをスワイプしても存在しない場合もあります)、ViewPagerにはビューがもう有効ではないことを伝え、更新されたビュー。私は、ビューの位置ではなく、ビュー自体との整数であることをご参照オブジェクトを変更し

public class SequenceAdapter extends PagerAdapter { 

    private List<View> mList; 

    /** List of all the views/positions that have changed since last update */ 
    private List<Integer> mChanged; 

    public SequenceAdapter(){ 
     this.mList = new ArrayList<>(); 
     this.mChanged = new ArrayList<>(); 
    } 

    public void add(View viewGroup){ 
     mList.add(mList.size(), viewGroup); 
     notifyDataSetChanged(); 
    } 

    public View get(int position) { 
     return mList.get(position); 
    } 

    public void update(View view, int position) { 
     mList.set(position, view); 
     mChanged.add(position); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public int getCount() { 
     return mList.size(); 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     int position = (Integer) object; 
     return view == mList.get(position); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     View view = mList.get(position); 
     container.addView(view, position); 
     return new Integer(position); 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     return null; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     int position = (Integer) object; 
     return mChanged.contains(position) ? POSITION_NONE : position; 
    } 

    @Override 
    public void finishUpdate(ViewGroup container) { 
     mChanged.clear(); 
    } 

} 

注:

は、ここでは、あなたのアダプタで行うことができます一つのことです。これは物事を少し楽にします。

get()メソッドでは、ビューにアクセスしてからupdate()に更新できます。ビューを更新すると、現在表示されているビューがViewPagerの場合はgetItemPosition()が呼び出されます。 POSITION_NONEが返された場合は、その位置にinstantiateItem()コールが必要です。 ViewPagerがアダプタへの複数の呼び出しで更新されるため、完了時に通知する必要があります。finishUpdate()をオーバーライドして、変更済みとマークされた位置をクリアします。

+0

右。だからコードの面で..あなたは私に例を与えることができますか? – Kanellis

+0

便利なコードを投稿するには、既存のコードを参照する必要があります。現在のコードで質問を更新すると便利です。 –

+0

どちらですか?アダプタリファレンス? – Kanellis

関連する問題