0

タブのためのフラグメントを含むタブアクティビティがあります。タブの1つにSQLiteデータベーステーブル(またはテーブルが空の場合は別のフラグメント)からのデータのリストが表示されます。 Tabsアクティビティは、最初にタブを作成するときに、そのテーブルにデータが含まれているかどうかを確認します。存在する場合、リストFragmentを初期化しますが、CursorAdapterは設定しません。 CursorAdapterは、SQLiteデータベースと中央データベースを同期させ、カーソルとCursorAdapterを作成するAsyncTaskによって初期化されます。 List Fragmentは、AsyncTaskがCursorAdapterを作成するのを待っている間にProgressDialogを表示します。 CurserAdapterが初期化されると、ProgressDialogは終了しますが、notifyDataSetChanged()の呼び出しにもかかわらず、ListViewは '空のリスト'ビューのままです。私がタブを切り替えて戻った場合、ListViewはデータを正しく表示します。 CursorAdapterが初期化された後、どのようにListViewの更新を行うことができますか?コードのCursorAdapterを初期化した後にリストビューを更新します

関連ビット:

タブ:

private static ImageCursorAdapter friendCursorAdapter = null; 

public static ImageCursorAdapter getFriendsListAdapter() { 
    return friendCursorAdapter; 
} 

public static void setFriendsListAdapter(ImageCursorAdapter adapter) { 
    friendCursorAdapter = adapter; 
    friendCursorAdapter.notifyDataSetChanged(); 
} 

SyncTask:

protected Void doInBackground(Void... params) { 
    sql = "SELECT COUNT(*) FROM " + WhereWolfOpenHelper.FRIEND_TABLE_NAME; 
    statement = db.compileStatement(sql); 
    count = statement.simpleQueryForLong();   
    if(count>0) { 
     friendCursor = db.query(WhereWolfOpenHelper.FRIEND_TABLE_NAME, null, null, null, null, null, WhereWolfOpenHelper.FRIEND_FIRST_NAME_COLUMN+", "+WhereWolfOpenHelper.FRIEND_LAST_NAME_COLUMN); 
    } 
    statement.close(); 
} 

@Override 
protected void onPostExecute(Void param) { 
    if(friendCursor!=null) { 
     ImageCursorAdapter adapter = new ImageCursorAdapter(WhereWolfActivity.this, friendCursor, 0, ImageCursorAdapter.FRIENDS); 
     Tabs.setFriendsListAdapter(adapter); 
    } 
} 

FriendsList:

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setListAdapter(Tabs.getFriendsListAdapter()); 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    if(Tabs.getFriendsListAdapter()==null) { 
     final ProgressDialog dialog = ProgressDialog.show(getActivity(), getString(R.string.loadingtitle), getString(R.string.loading), true, false); 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while(Tabs.getFriendsListAdapter()==null) {} 
       dialog.dismiss();    
       Tabs.getFriendsListAdapter().notifyDataSetChanged(); 
      } 
     }); 
     thread.start();   
    } 
} 

答えて

0

ます新しいアダプタを作成していますが、アダプタをリストに設定するコードはありません。あなたの新しいアダプタについてはリストに何も分かっていないので、notifyDataSetChanged()と呼んでも役に立ちません。ところで、すでにフラグメントを使用している場合は、ローダーの使用を検討することもできます。

+0

こんにちは。申し訳ありませんが私はそのビットを逃した。 FriendsListコードに追加しました。私はCursorLoaderの使用を検討しましたが、プライベートデータベースなのでContentProviderとしてデータベースを設定していません。 – Pikaling

+0

これで問題は解決しましたか?ところで、あなたは簡単にあなたのカスタムデータベースをサポートするローダーを書くことができます。 CursorLoaderのソースコードをコピーし、ContentProviderの部分を独自の実装に置き換えてください。ここにサンプルがあります:http://code.google.com/p/wwwjdic/source/browse/branches/2.0/wwwjdic/src/org/nick/wwwjdic/history/HistoryLoaderBase.java –

+0

いいえ、私はしませんでした。私はローダーを探し始めましたが、それは解決策かもしれませんが、私は現在彼らに混乱しています:-) – Pikaling

関連する問題