У меня есть активность вкладок, которая содержит фрагменты для вкладок. На одной из вкладок отображается список данных из таблицы данных SQLite (или другой фрагмент, если таблица пуста). При первоначальном создании вкладок активность вкладок проверяет, содержит ли таблица какие-либо данные. Если это так, то он инициализирует фрагмент списка, но не настраивает CursorAdapter. CursorAdapter инициализируется AsyncTask, который синхронизирует базу данных SQLite с центральной базой данных, а затем создает курсоры и курсорные адаптеры. В списке Fragment отображается ProgressDialog, ожидая, пока AsyncTask создаст CursorAdapter. Когда инициализируется CurserAdapter, ProgressDialog отклоняется, но ListView остается в представлении «пустой список», несмотря на вызовы notifyDataSetChanged(). Если я переключу вкладки и вернусь, ListView отобразит данные правильно. Как я могу создать обновление ListView после инициализации CursorAdapter?Update 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();
}
}
Hi. Извините, я пропустил это. Я добавил его в код FriendsList. Я рассматривал использование CursorLoader, но у меня нет базы данных, настроенной как ContentProvider, так как это частная база данных. – Pikaling
Это решило вашу проблему? BTW, вы можете легко написать загрузчик, который поддерживает вашу собственную базу данных. Просто скопируйте исходный код CursorLoader и замените часть ContentProvider своей пользовательской реализацией. Вот пример: http://code.google.com/p/wwwjdic/source/browse/branches/2.0/wwwjdic/src/org/nick/wwwjdic/history/HistoryLoaderBase.java –
Нет, я этого не сделал. Я начал смотреть в Loaders и, похоже, это может быть решением, хотя я в настоящее время их смущен :-) – Pikaling