2013-04-18 12 views
5

リストビューがデータベースのデータで満たされていないときに進捗インジケータを表示するにはどうすればよいでしょうか?CursorLoaderを使用してリストビューを塗り潰す前に進捗インジケータを表示

私はassynctaskを使用してこれを行う方法のいくつかの例を見つけましたが、私の場合はLoader/CursorLoaderを使用しています。

public class TestActivity extends SherlockFragmentActivity implements 
    LoaderCallbacks<Cursor> { 

SimpleCursorAdapter mAdapter; 
ListView mListView; 

private static final String[] UI_BINDING_FROM = new String[] { 
     TestDBAdapter.KEY_NAME, TestDBAdapter.KEY_ICON }; 

private static final int[] UI_BINDING_TO = new int[] { R.id.text, R.id.icon }; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_Test); 

    mListView = (ListView) findViewById(R.id.listview); 

    mAdapter = new TestAdapter(getApplicationContext(), 
      R.layout.list_item_Test, null, UI_BINDING_FROM, 
      UI_BINDING_TO, 0); 

    mListView.setAdapter(mAdapter); 

    getSupportLoaderManager().initLoader(0, null, this); 

} 

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 


    Uri uri = ContentProviderTest.CONTENT_URI; 

    CursorLoader cursorLoader = new CursorLoader(
      this, 
      uri, 
      null, 
      null, 
      null, 
      null); 

    return cursorLoader; 

} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    mAdapter.swapCursor(null); 
} 
} 

可能な解決策は、ListFragmentを拡張する新しいクラスを作成し、setListShown()方法を使用することですが、それはこの問題を解決するための最良の方法である場合、私は知りません。

おかげ

答えて

13

は「ゴーン」に設定し、その可視性と、あなたのレイアウトファイルに小さなプログレスバーを追加します。 CursorLoaderを作成する直前に、その可視性を「可視」に設定します。表示されます。 onLoadFinishedでは、ProgressBarの可視性を「消える」ように設定します。表示されなくなり、ListViewがロードされます。

小さなスタイルのプログレスバーを使用します。詳細については、android.widget.ProgressBarのリファレンスドキュメントを参照してください。

ところで、可視性はView.setVisibilityで制御されます。正しい答えに加えて

+0

あなたの回答は私に[この例を]手伝ってくれました(http://stackoverflow.com/questions/12559461/how-to-show-progress-barcircle-in-an-activity-having-a-listview-before-loading/12559601#12559601)。私はこれが最も簡単な方法だと信じています。ありがとうございます – elirigobeli

0

:カーソル月、データとデシベルを埋めるために、あなたのcurstom Serviceに頼るの場合には、それ以外の場合は

if (cursor.getCount() > 0) { 
    getView().findViewById(R.id.loadingPanel).setVisibility(View.GONE); 
    getView().findViewById(android.R.id.list).setVisibility(View.VISIBLE); 
} 

:それは、このチェックを持ってonLoadFinished()に良いアイデアです空でなければならず、結果は進捗バーにも表示されません。

+0

ローダーを無限に表示することは良い考えではなく、getCount()== 0のときに適切なメッセージ "レコードが見つかりません" –

0

私はlistViewにcostumCursorAdapterを持っています。

データがデータベースで変更されたときにcostumCursorAdapterをスワップするcursorLoaderもあります。 DBデータは、ユーザが開始した検索によって入力される。これらのアドバイスの

なしは、Googleが何の助けなかった、働いていない - 何もsulotion-

  1. 「今だけは」シンプルかつ1回と最終的 i.e. progress_bar.setVisibility(View.Gone);

    を可視 - に設定し、プログレスバーを、立ち止まっていません私はカウンタとして動作するグローバル変数を作成しましたint count = 0。 検索のたびに0にリセットされます(ボタンの方法はonClick)。

  2. customAdapterのbindViewでは、このコードブロックの最後に、count ++でカウントを開始しました。 customAdapterは私が知っている、第四ビューを結合するとき、

     if (count==4){ 
         pb.setVisibility(View.GONE); 
        } 
    
  3. この方法:私はそれがある場合はカウントが4に達した場合、私はプログレスバーを非表示にチェックコードブロックの上部に

  4. プログレスバーを止めることができます。

  5. 私は決してリストの4つ以上の項目を持っていません。

希望すると、誰かに役立ちます。

関連する問題