首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在非UI线程上执行工作后刷新SimpleCursorAdapter

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

Stack Overflow用户
提问于 2011-02-16 14:54:50
回答 2查看 8.2K关注 0票数 1

我正试图从解析XML的非UI线程中调用ListView中显示的SimpleCursorAdapter上的.notifyDataSetChange(),但我永远也搞不清楚如何调用。我到处搜索,我找到的所有文章都是关于从ListView本身进行刷新的文章,而我没有这样做。我想不出一种方法来传递适配器,或者从父级获取它,或者从另一个线程调用它上的方法所需的任何操作。

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

答案可能很简单,只是让我摸不着头脑。提前感谢您的帮助!

下面是我的代码:

代码语言:javascript
复制
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();
    }
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-16 15:06:42

不需要创建新的适配器...

只有在数据行实际发生变化(插入或删除行)的情况下才应该调用.notifyDataSetChanged(),如果您只是更新了行上的值,那么在游标上调用requery()就足够了:

代码语言:javascript
复制
adapter.getCursor().requery();

编辑:通过你的评论,我看到你实际上有一个编译问题...

您必须将适配器声明为类成员(在mHandler之前/之后声明它:private SimpleCursorAdapter adapter)

然后,在初始化它时,替换

代码语言:javascript
复制
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
    R.layout.directory_people_item, mCursor,
    new String[]{
        //snip
        new int[]{
        //snip
); 

通过以下方式:

代码语言:javascript
复制
adapter = new SimpleCursorAdapter(this,
    R.layout.directory_people_item, mCursor,
    new String[]{
        //snip
        new int[]{
        //snip
); 
票数 12
EN

Stack Overflow用户

发布于 2011-02-16 15:02:04

查询完成后,创建一个新的适配器,并将其设置为列表视图。下面是一个网格视图示例,对其进行相应更改以满足您的需要

代码语言:javascript
复制
globalAdapter = new GridImageAdapter(getApplicationContext());
globalAdapter.notifyDataSetChanged();
grid.setAdapter(globalAdapter);
grid.invalidateViews();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5013380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档