gpt4 book ai didi

android - 在非 UI 线程上执行工作后刷新 SimpleCursorAdapter

转载 作者:行者123 更新时间:2023-11-29 14:19:38 24 4
gpt4 key购买 nike

我正在尝试从 XML 解析非 UI 线程在 ListView 中显示的 SimpleCursorAdapter 上调用 .notifyDataSetChange(),但我终究无法弄清楚如何调用。我搜索了所有内容,发现的所有内容都是谈论从 ListView 本身内部刷新的文章,我没有这样做。我想不出一种方法来传递适配器或从父级获取它,或者我需要做些什么来从另一个线程调用它的方法。

ListView 将在我下次启动 Activity 时正常更新,但我希望它在 XML 解析完成后立即刷新,以便用户立即看到新数据。

答案可能很简单;它只是在躲避我。在此先感谢您的帮助!

这是我的代码:

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

最佳答案

无需创建新的适配器...

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

关于android - 在非 UI 线程上执行工作后刷新 SimpleCursorAdapter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5013380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com