19

ViewPagerこれは可能のようですが、無期限にページングできるを実装する方法を理解するのに少し問題があります。

私のユースケースは、一度に1か月を表示するカレンダーですが、十分な回数ページングすることで任意の月に切り替えることができます。

現在、私はちょうどですextending PagerAdapter、そして3つのカスタムMonthViewsが次のように追加されます:

    @Override
    public Object instantiateItem(View collection, int position) {
        final MonthView mv = new MonthView(HistoryMonthActivity.this);
        mv.setLayoutParams(new ViewSwitcher.LayoutParams(
                android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                android.view.ViewGroup.LayoutParams.MATCH_PARENT));
        mv.setSelectedTime(mTime);

        ((DirectionalViewPager) collection).addView(mv, 0);

        return mv;
    }

ユーザーがタブを使用MonthViewしているときにデータベースからのデータを表示するのに大きな遅延が発生しないように、一度に3秒だけメモリに保持したいと思います。MonthViewしたがって、新しいページが表示されるたびに、ページを削除MonthViewして追加する必要がありMonthViewます。誰かが同じ機能についてより良いアイデアを持っているなら、私はそれを聞いてみたいです!

を使おうと思っていFragmentStatePagerAdapterます。

4

2 に答える 2

8

MonthView私は、自分の、自分の、のPagerAdapter小さな 魔法を使って、そしてそれ自体OnPageChangeListenerのソースコードを編集することで、これを実装することができました。ViewPager誰かが私がそれをどのように達成したかに興味があるなら、ソースコードをチェックするか、特定の質問でコメントしてください。

于 2011-09-18T17:06:55.020 に答える
6

実際、私はこの「無限の」ページネーションを行うためのさまざまな方法を検討してきました。人間の時間の概念は無限であるということですが(時間の始まりと終わりの概念があるとしても)、コンピューターはディスクリートで。最小時間と最大時間があります(時間の経過とともに調整できます。Y2K問題の根拠を覚えていますか?)。

とにかく、この議論のポイントは、実際には有限の日付範囲を通じて比較的無限の日付範囲をサポートするのに十分であるか、または十分であるべきであるということです。この良い例は、AndroidフレームワークのCalendarView実装とそのWeeksAdapter内部です。デフォルトの最小日付は1900で、デフォルトの最大日付は2100です。これは、今日の半径10年以内の人のカレンダー使用の99%を簡単にカバーするはずです。

彼らが実装で行うこと(週に焦点を当てる)は、最小日と最大日の間の週数を計算することです。これがポケットベルのページ数になります。ポケットベルは、これらすべてのページを同時に維持する必要はなく(setOffscreenPageLimit(int))、ページ番号(またはインデックス/位置)に基づいてページを作成できる必要があることを忘れないでください。この場合、インデックスは、その週が最小日からの週数です。このアプローチでは、最小の日付とページ数(最大の日付までの距離)を維持するだけで、どのページでも、そのページに関連付けられている週を簡単に計算できます。ViewPagerループ(別名無限のページネーション)をサポートしていないという事実の周りで踊ったり、無限にスクロールできるように強制的に動作させようとしたりすることはありません。

new FragmentStatePagerAdapter(getFragmentManager()) {
    @Override
    public Fragment getItem(int index) {
        final Bundle arguments = new Bundle(getArguments());
        final Calendar temp_calendar = Calendar.getInstance();
        temp_calendar.setTimeInMillis(_minimum_date.getTimeInMillis());
        temp_calendar.setFirstDayOfWeek(_calendar.getStartOfWeek());
        temp_calendar.add(Calendar.WEEK_OF_YEAR, index);
        // Moves to the first day of this week
        temp_calendar.add(Calendar.DAY_OF_YEAR,
                -UiUtils.modulus(temp_calendar.get(Calendar.DAY_OF_WEEK) - temp_calendar.getFirstDayOfWeek(),
                7));
        arguments.putLong(KEY_DATE, temp_calendar.getTimeInMillis());
        return Fragment.instantiate(getActivity(), WeekDaysFragment.class.getName(), arguments);
    }

    @Override
    public int getCount() {
        return _total_number_of_weeks;
    }
};

次にWeekDaysFragment、引数で渡された日付から始まる週を簡単に表示できます。

于 2012-12-26T22:31:14.963 に答える