我有一个Tabs Activity,其中包含选项卡的片段。其中一个选项卡显示SQLite数据库表中的数据列表(如果表为空,则显示不同的片段)。最初创建选项卡时,选项卡活动会检查表是否包含任何数据。如果是,则初始化列表片段但不设置CursorAdapter。 CursorAdapter由AsyncTask初始化,它将SQLite数据库与中央数据库同步,然后创建Cursors和CursorAdapters。列表片段在等待AsyncTask创建CursorAdapter时显示ProgressDialog。初始化CurserAdapter时,ProgressDialog被解除,但ListView仍保留在其“空列表”视图中,尽管调用notifyDataSetChanged()。如果我切换标签并返回,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);
}
}
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 :(得分:0)
您正在创建一个新适配器,但我没有看到任何代码将适配器设置为列表。由于列表对您的全新适配器一无所知,因此调用notifyDataSetChanged()
无济于事。顺便说一句,如果您已经在使用片段,可以考虑使用Loader。