我正试图从解析XML的非UI线程中调用ListView中显示的SimpleCursorAdapter上的.notifyDataSetChange(),但我永远也搞不清楚如何调用。我到处搜索,我找到的所有文章都是关于从ListView本身进行刷新的文章,而我没有这样做。我想不出一种方法来传递适配器,或者从父级获取它,或者从另一个线程调用它上的方法所需的任何操作。
下次启动活动时,ListView将正常更新,但我希望在解析完成后立即刷新它,以便用户可以立即看到新数据。
答案可能很简单,只是让我摸不着头脑。提前感谢您的帮助!
下面是我的代码:
public class DirectoryListActivity extends DirectoryActivity {
public final Handler mHandler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.directory_list);
// Populate the ListView
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(
directoryPeople.PEOPLE_TABLE
);
String asColumnsToReturn[] = {
//snip
};
mCursor = queryBuilder.query(mDB, asColumnsToReturn, null, null,
null, null, directoryPeople.DEFAULT_SORT_ORDER);
startManagingCursor(mCursor);
// HERE'S THE ADAPTER
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.directory_people_item, mCursor,
new String[]{
//snip
new int[]{
//snip
);
ListView av = (ListView)findViewById(R.id.listPeople);
av.setAdapter(adapter);
//Perform sync in background
startXMLParseThread();
}
public void startXMLParseThread() {
new Thread () {
boolean success = false;
public void run() {
try {
// XML-Parsing and Table-Updating code
} catch (Exception e) {
success = false;
}
mHandler.post(new Runnable() {
public void run() {
TextView txtUpdateStatus = (TextView)findViewById(R.id.txtUpdateStatus);
if (success) {
txtUpdateStatus.setText(R.string.synced);
} else {
txtUpdateStatus.setText(R.string.sync_failed);
}
adapter.notifyDataSetChanged(); // ECLIPSE HATES
}
});
}
}.start();
}
}
}发布于 2011-02-16 15:06:42
不需要创建新的适配器...
只有在数据行实际发生变化(插入或删除行)的情况下才应该调用.notifyDataSetChanged(),如果您只是更新了行上的值,那么在游标上调用requery()就足够了:
adapter.getCursor().requery();编辑:通过你的评论,我看到你实际上有一个编译问题...
您必须将适配器声明为类成员(在mHandler之前/之后声明它:private SimpleCursorAdapter adapter)
然后,在初始化它时,替换
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.directory_people_item, mCursor,
new String[]{
//snip
new int[]{
//snip
); 通过以下方式:
adapter = new SimpleCursorAdapter(this,
R.layout.directory_people_item, mCursor,
new String[]{
//snip
new int[]{
//snip
); 发布于 2011-02-16 15:02:04
查询完成后,创建一个新的适配器,并将其设置为列表视图。下面是一个网格视图示例,对其进行相应更改以满足您的需要
globalAdapter = new GridImageAdapter(getApplicationContext());
globalAdapter.notifyDataSetChanged();
grid.setAdapter(globalAdapter);
grid.invalidateViews();https://stackoverflow.com/questions/5013380
复制相似问题