私はCWAC の EndlessAdapterを使用して、ListView の無限スクロールを実現しています。
ViewPager と同等のことを実現したいと思います。残念ながら、PageAdapter と ListAdapter は同じ基本クラスを共有していません。
これについて最善の方法は何ですか?すでにこれを処理するライブラリは存在しますか?
私はCWAC の EndlessAdapterを使用して、ListView の無限スクロールを実現しています。
ViewPager と同等のことを実現したいと思います。残念ながら、PageAdapter と ListAdapter は同じ基本クラスを共有していません。
これについて最善の方法は何ですか?すでにこれを処理するライブラリは存在しますか?
これについて最善の方法は何ですか?
の独自の実装に「エンドレス」ロジックを追加しますPagerAdapter
。または、必要に応じて、通常PagerAdapter
の を装飾する方法である装飾を作成してみてください。EndlessAdapter
Adapter
ページがビューまたはフラグメントになるように設計されていることを考えると、後者はトリッキーになる可能性が高くPagerAdapter
、クラスの内部でのフラグメント処理FragmentPagerAdapter
は少し怖いです。
すでにこれを処理するライブラリは存在しますか?
私が知っているものはありません。
主に、ユースケースが説得力がないように見えるためです。を使用するListView
と、ユーザーは数十または数百の行を非常にすばやくスクロールして、リストをすばやく表示できます。したがって、より多くのデータをロードするトリガーとして「最後まで到達しました」を使用することは合理的と思われます。ただし、 を使用すると、特にまたは同等のものViewPager
を使用していない場合は、通常、最後に到達するまでに時間がかかります。PagerTabStrip
したがって、ユーザーが最後まで待って追加データのロードを開始するのは、ユーザーにとって煩わしいように思えます。これまでずっと、さらにデータを取得する必要がありましたが、それを使用していませんでした。
したがって、別の方法は、 を に登録することViewPager.OnPageChangeListener
ですViewPager
。onPageSelected()
が終わりに近づいていると感じたら、(AsyncTask
または何でも)を開始して、さらにデータを収集します。問題は、データが更新されたら、そのアダプターで使用されるデータを更新し、そのアダプターPagerAdapter
を呼び出す必要があることですnotifyDataSetChanged()
。
@Override
public int getCount() {
return (Integer.MAX_VALUE);
//artificially large value for infinite scrolling
}
public int getRealCount(){
//Do something to return the actual number of objects.
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
int virtualPosition = position % getRealCount();
return instantiateVirtualItem(container, virtualPosition);
}
public Object instantiateVirtualItem(ViewGroup container, final int position) {
//Do the required part here
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
int virtualPosition = position % getRealCount();
destroyVirtualItem(container, virtualPosition, object);
}
public void destroyVirtualItem(ViewGroup container, int position, Object object){
container.removeView((View) object);
}
さて、最も重要な部分
pager.setOffscreenPageLimit(10); //your choice
pager.setCurrentItem(Integer.MAX_VALUE/2,false);
//pager is the ViewPager object
PS:これをうまく実装しました。それでも疑問がある場合は質問してください。
たぶん、次のように「偽装」できます。
膨大な数のページを表示する可能性があります。使用FragmentStatePagerAdapter
クラス:
https://developer.android.com/reference/android/support/v13/app/FragmentStatePagerAdapter.html
getCount
を返すことによってメソッドを実装しInteger.MAX_VALUE
ます。
常に を返すことで getItemPosition メソッドを実装しPOSITION_NONE
ます。
必要に応じてメソッドを実装しgetItem
、適切な Fragment を返します。
次に、ViewPager をホストするアクティビティが開始されたら、ViewPager の初期位置を非常に大きな数に設定しviewPager.setCurrentItem(Integer.MAX_VALUE / 2);
ます。
私はこれを自分で試したことはありません..., YMMV! :)