0

タブのフラグメントを含むタブアクティビティがあります。タブの1つに、SQLiteデータベーステーブル(またはテーブルが空の場合は別のフラグメント)のデータのリストが表示されます。タブを最初に作成するとき、タブアクティビティはテーブルにデータが含まれているかどうかを確認します。含まれている場合は、リストFragmentを初期化しますが、CursorAdapterを設定しません。CursorAdapterは、SQLiteデータベースを中央データベースと同期するAsyncTaskによって初期化され、次にCursorsとCursorAdaptersを作成します。リストFragmentは、AsyncTaskがCursorAdapterを作成するのを待っている間、ProgressDialogを表示します。CurserAdapterが初期化されると、ProgressDialogは閉じられますが、notifyDataSetChanged()が呼び出されても、ListViewは「空のリスト」ビューのままになります。タブを切り替えて戻ってきたら、ListViewはデータを正しく表示します。CursorAdapterが初期化されたら、どうすればListViewを更新できますか?

コードの関連ビット:

タブ:

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

友達リスト:

@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();         
    }
}
4

1 に答える 1

0

新しいアダプタを作成していますが、アダプタをリストに設定するためのコードが表示されません。リストはあなたの真新しいアダプターについて何も知らないので、電話notifyDataSetChanged()は役に立ちません。ところで、すでにフラグメントを使用している場合は、ローダーの使用を検討してください。

于 2011-08-11T15:21:24.453 に答える