9

ビューページャーを実装するためのソリューションが必要です。まず、データベースから単一のページに巨大なデータをロードしているため、バックグラウンドでフェッチタスクを実行しているため、スワイプ中にスワイプの頻度が低下することがあります(ページを複数回スワイプする必要があります)。ビューを返すために非同期タスクを使用していません。ページを遅延ロードする方法はありますか? ユーザーがスワイプで他のページに移動できるようにしますが、データは遅延ロードされます。

私のコードサンプルは以下の通りです;

 public Object instantiateItem(View container, int position) {

View v;

v = View.inflate(context,R.layout.swipearea, null);

listView = (ListView)v.findViewById(R.id.MyListView);
largeDataCall();
((ViewPager)container).addView(v);
return v;
}

これを create メソッドで呼び出しています。

pager=(ViewPager) findViewById(R.id.pagerAdapter);
pager.setAdapter(new SimplePager(MyPager.this));
pager.setCurrentItem(364);

解決策はありますか?

4

6 に答える 6

17

フラグメントを使用することをお勧めします(ビューを直接使用するのではありません)。

フラグメントがいつ表示されるかを伝えるには、フラグメントにインターフェースが必要です。

public interface IShowedFragment {

    public void onShowedFragment();
}

すべてのフラグメントにそのインターフェースを実装させ、そのメソッドで loader/asyncTasks/background タスクを呼び出します。

次に、ViewPager に onPageChangeListener を配置し、ユーザーがページを変更したことを検出したら、フラグメントでインターフェイス メソッドを呼び出します。このリスナーにはいくつかの選択肢があり、viewPager が停止してスライドしてインターフェイス呼び出しをトリガーするのを待つことができるメソッドの 1 つを使用します。

この呼び出しを行うための適切なフラグメントを取得できるようにするには、yourFragmentApadter.instantiateItem(ViewGroup, int) からフラグメントを取得します。フラグメントが既に読み込まれている場合は、その位置のフラグメントが返されます。

mPager.setOnPageChangeListener(new OnPageChangeListener() {

  @Override
  public void onPageSelected(int position) {

      Fragment fragment = (Fragment) mAdapter.instantiateItem(mPager, position);
      if(fragment instanceof IShowedFragment){
           ((IShowedFragment) fragment).onShowedFragment();
      }
  }
  (...)

そのように、空のビューでフラグメントを準備し、1 つをスライドすると、データの読み込みが開始されます。

于 2012-05-22T13:45:40.287 に答える
3

非常によく似たタスクを完了しました。問題の解決策を見つけるために、次の点を順番に検討してください。

  1. 最初にそのすべてのデータをフェッチする必要があるかどうかを確認します。ロードする必要のある情報とそれを使って何をしているのか(画面にリストとして表示しますか?)について、詳細を投稿してください。
  2. CursorLoaderデータベースフェッチなどの手間のかかるタスクを非同期的に実行するsの使用を検討してください。インターウェブに関するこのチュートリアルでは、ContentProviderAndroidアプローチを紹介します。これらの用語があまり意味をなさない場合は、AndroidURIとContentProviderの公式ドキュメントをよく理解しておくことをお勧めします。
  3. フラグメントを使用している場合-FragmentStatePagerAdapter従来のの代わりにを使用することを検討してくださいFragmentPagerAdapter。このアダプタは使用していませんが、現在表示されているフラグメントのみをインスタンス化することを読みました。つまり、現在選択されているタブの右側または左側にあるフラグメントはインスタンス化しません。
  4. DBに対して実行しているクエリの最適化を検討してください。
于 2012-05-22T14:29:01.910 に答える
1

同様の問題がありました。重いデータをロードしていたビューページャー。個々のページのビューを頻繁に変更しない場合は、ページをメモリに保持することをお勧めします。これを実行するには、次のコードを使用します

mViewPager.setOffscreenPageLimit(#pages); to keep #pages in memory. I had 5 pages so my #pages was 4. 

ビューページャー スライドのデータを更新する場合は、次を使用します。

mViewPager.getAdapter().notifyDataSetChanged(); with getItemPosition() returning POSITION_NONE.

FragmentStatePagerAdapter を使用します。

于 2013-01-30T16:18:13.653 に答える
1

instantiateItemViewPagerがスワップしようとしており、ビューが必要なときに呼び出されます。実際にすべてを作成する必要はありません。最終的に、遅延読み込みはなくなったと思います。私の見解では、ここで行う必要があることが 2 つあります。

1: ユーザーがページに到達しようとしているときに、バックグラウンドでデータをキャッシュします。あなたの例では、364ページ(良い主)と主張しているので、リスナーを使用してページの変更を処理すると思います。363 ページにいるときは、364 のデータのロードを開始します。364 にいるときは、365 でデータのロードを開始し、ユーザーが元に戻したい場合に備えて 363 のデータを保持します。データの読み込みが比較的速い場合、またはユーザーがスワップするのに時間がかかる場合は、asyncTask またはスレッドを使用してデータを読み込むと仮定しても問題ありません。

2: データが取得されるまでデータが入力されないバックアップの既定のビューを用意します。データを取得する前にユーザーがページをロードした場合に備えて、オプション 1 でもこれを行う必要があります。基本的に、データを取得するまで、「読み込み中...」などのビューを表示するだけです。それか、取得したデータをリアルタイムで入力します。その場合、ユーザーにはビルドが表示されます。

いずれにせよ、アプリの見栄えを良くするために何かをキャッシュする必要があると思います。

于 2012-05-22T13:47:54.233 に答える
0

Android点火ライブラリを調べましたか?Sample-applicationsによると、コンポーネント「Endless List」と http-cache コンポーネントがあります。

私は自分で試したことがなく、これがあなたにとっての解決策であるかどうかわかりません-例を見ただけです.....

于 2012-05-22T13:56:20.183 に答える
0

あなたが説明した同期方式でデータを遅延ロードする方法はないと思います。AsyncTask を使用するか、スレッドを直接使用することもできます。AsyncTask は、この種の機能のために特別に設計されたものだと思います。スレッドを直接使用する方が簡単です。実装に関するアイデアが必要な場合は、http: //geekjamboree.wordpress.com/2011/11/22/asynctask-call-web-services-in-android/をご覧ください。

于 2012-05-22T13:36:35.737 に答える