2012-05-22 11 views
8

ビューページャの実装には解決策が必要です。 最初に私はデータベースから巨大なデータを1ページに読み込んでいます。そのため、スワイプ中にスワイプ周波数が遅くなることがあります(ページを複数回スワイプする必要があります)。 ビューを返すために非同期タスクを使用しません。 ロードページを遅延させる方法はありますか?ユーザーがスワイプで他のページに移動できるようにするだけですが、データは遅延ロードされます。アンドロイドはビューページャでデータを非同期にロードします

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

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; 
} 

私はこれを作成メソッドで呼び出しています。

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

解決策はありますか?

答えて

0

あなたが記述した同期的な方法でデータを読み込む方法がないとは思っていません。 AsyncTaskは、スレッドを直接使用する方法です。私はAsyncTaskがこの種の機能のために特別に設計されていると信じています。スレッドを直接使用する方が簡単です。実装についてのアイデアが必要な場合は、次をご覧ください。 http://geekjamboree.wordpress.com/2011/11/22/asynctask-call-web-services-in-android/

+1

指定されたリンクにビューポケットベルの実装が表示されません。 – Hanry

+0

ビューページャの例については、次を参照してください。http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html and http://android-developers.blogspot.in/2011/08/horizo​​ntal -view-swiping-with-viewpager.html最適なユーザーエクスペリエンスを得るには、この種の実装をAsyncTaskで接続する必要があります。 –

17

私はフラグメントで作業することをお勧めします。あなたは彼らが表示されているときにそれらを伝えるためにあなたの破片のインターフェイス必要

public interface IShowedFragment { 

    public void onShowedFragment(); 
} 

は、すべてのフラグメントがそのインターフェイスを実装してください、そしてその方法であなたのローダー/ asyncTasks /バックグラウンドタスクを呼び出します。

次に、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(); 
     } 
    } 
    (...) 

空のビューでフラグメントを準備することができ、スライドをスライドするとデータを読み込みます。

+0

サンプル実装はありますか? – Hanry

+3

フラグメントはあなたの人生を楽にします。フラグメント内でそれらを実装した場合は、必要なときにデータを(非同期に)ロードしてから、フラグメントのcreateView()に表示することができます。 http://developer.android.com/reference/android/support/v13/app/FragmentStatePagerAdapter.html – DeeV

+1

一部の実装が追加されました(欠落しているのは、onShowedFragment()が実装され、データを非同期に読み込むフラグメントの例です) 。 – galex

1

instantiateItemViewPagerがスワップして表示する必要がある場合に呼び出されます。実際にすべてを作成するのににはがありません。私は最終的に、レイジーローディングが出ていると思います。私がそれを見る方法は、あなたがここで行う必要がある2つのことがあります。

1: ユーザーがページに近づいているときに、データをバックグラウンドでキャッシュします。あなたの例では、364ページ(良い主)と言われているので、ページの変更を処理するためにリスナーを使うといいでしょう。 363ページでは、364のデータの読み込みを開始します.364になったら、365でデータの読み込みを開始し、ユーザーが元に戻す場合は363にデータを保持します。データが比較的速く読み込まれたり、ユーザーがスワップするのに時間がかかる場合は、データをロードするためにasyncTaskまたはスレッドを使用していると仮定すれば、見た目にはならないはずです。

2:データを取得するまでデータが入力されないバックアップのデフォルトビューを用意してください。データを取得する前にユーザーがページをロードする場合は、オプション1を使用してこれを行う必要があります。基本的には、データを取得するまで、「読み込み中...」と表示されます。どちらかというと、データを取得したときにリアルタイムでデータを取り込むことができます。その場合、ユーザーはそれが構築されるのを見るでしょう。

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

+0

ログでは、現在のアイテムを364に設定すると、ビューページャは同時に363,364,365のデータのロードを開始することがわかります。最初の読み込みに問題はありませんが、ユーザーがスワイプすると、たとえば364から365のビューページャーから366ページのデータが読み込まれますが、366ページのデータが非常に高い場合は、数秒間ビューがフリーズすることがあります。 – Hanry

+0

これは、3つの異なるページのデータを同期してUIスレッドにロードしていることを意味します.2つのページは表示されません。また、あなたの仕事の半分が行われます。スレッドを使用すると、処理速度が大幅に向上するはずです。 – DeeV

+0

ユーザーがスワイプしたときにすべてのデータを取得していない場合でも、デフォルトの「未完了」ビューが必要です。 – DeeV

0

android ignition libraryを調べましたか? Sample-applicationsによれば、コンポーネント「エンドレスリスト」およびhttpキャッシュ構成要素が存在する。私はそれを自分自身を試してみましたhaventは、これはあなた-だけ見た例のためのソリューションがある場合は知らない

.....

3

は、私は非常によく似たタスクを完了しました。あなたの問題に対する解決策を見つけ出すには、次の点を順を追って検討してください。あなたが最初のインスタンスで、そのデータのすべてをフェッチする必要があるかどうかで

  1. ルック。ロードする必要のある情報と何をしているのか(スクリーン上のリストとして表示しますか?)
  2. このような重い持ち上げタスクを実行するのを見てくださいデータベースは非同期にフェッチされます。 interwebsのThis tutorialは、ContentProvider Androidアプローチを導入しています。これらの用語があまり意味を持っていない場合、公式のAndroid URIとContentProviderのドキュメントに慣れておくことをおすすめします。
  3. フラグメントを使用している場合 - 従来のFragmentPagerAdapterの代わりにFragmentStatePagerAdapterを使用してください。このアダプタは使用していませんが、現在表示されているフラグメント、つまり現在選択されているタブの右または左にあるフラグメントはインスタンス化されていないことがわかりました。
  4. DBに対して実行しているクエリの最適化を見てください。
+0

DeeVと同意します。このタスクは、各ViewPager、pageに対してフラグメントが使用されている場合は、より簡単に(より標準的に)なります。フラグメントが表示されるときに、onCreateViewが呼び出されます。これはasync dbアクセスと無意味なUIのために '' '' 'CursorLoader'''''sなどを初期化できるところです。多くの他の多くの人がそれをやっているので、これは確かに上記のコメントに反して可能です。 – OceanLife

1

私は同様の問題がありました。重いデータをロードしていたビューページャ。個々のページの表示を頻繁に変更しない場合は、ページをメモリに保存することをお勧めします。あなたはviewpagerスライド上にデータを更新したい場合は、この

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を使用しています。

関連する問題