11

私はCWAC の EndlessAdapterを使用して、ListView の無限スクロールを実現しています。

ViewPager と同等のことを実現したいと思います。残念ながら、PageAdapter と ListAdapter は同じ基本クラスを共有していません。

これについて最善の方法は何ですか?すでにこれを処理するライブラリは存在しますか?

4

3 に答える 3

15

これについて最善の方法は何ですか?

の独自の実装に「エンドレス」ロジックを追加しますPagerAdapter。または、必要に応じて、通常PagerAdapterの を装飾する方法である装飾を作成してみてください。EndlessAdapterAdapter

ページがビューまたはフラグメントになるように設計されていることを考えると、後者はトリッキーになる可能性が高くPagerAdapter、クラスの内部でのフラグメント処理FragmentPagerAdapterは少し怖いです。

すでにこれを処理するライブラリは存在しますか?

私が知っているものはありません。

主に、ユースケースが説得力がないように見えるためです。を使用するListViewと、ユーザーは数十または数百の行を非常にすばやくスクロールして、リストをすばやく表示できます。したがって、より多くのデータをロードするトリガーとして「最後まで到達しました」を使用することは合理的と思われます。ただし、 を使用すると、特にまたは同等のものViewPagerを使用していない場合は、通常、最後に到達するまでに時間がかかります。PagerTabStripしたがって、ユーザーが最後まで待って追加データのロードを開始するのは、ユーザーにとって煩わしいように思えます。これまでずっと、さらにデータを取得する必要がありましたが、それを使用していませんでした。

したがって、別の方法は、 を に登録することViewPager.OnPageChangeListenerですViewPageronPageSelected()が終わりに近づいていると感じたら、(AsyncTaskまたは何でも)を開始して、さらにデータを収集します。問題は、データが更新されたら、そのアダプターで使用されるデータを更新し、そのアダプターPagerAdapterを呼び出す必要があることですnotifyDataSetChanged()

于 2013-03-20T12:11:34.200 に答える
6
@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:これをうまく実装しました。それでも疑問がある場合は質問してください。

于 2013-03-22T07:41:52.513 に答える
5

たぶん、次のように「偽装」できます。

膨大な数のページを表示する可能性があります。使用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! :)

于 2013-03-19T22:39:08.767 に答える