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

时间:2011-02-16 06:54:50

标签: android

我正在尝试从一个XML解析非UI线程的ListView中显示的SimpleCursorAdapter上调用.notifyDataSetChange(),并且不能为我的生活弄清楚如何。我已经搜遍了所有我发现的文章都是关于从ListView本身内部进行刷新的文章,我没有这样做。我无法找到一种方法来传递适配器或从父节点获取它或我需要做什么来从另一个线程调用它的方法。

ListView将在下次启动活动时更新,但我希望在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();
    }
}
}

2 个答案:

答案 0 :(得分:12)

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

只有在数据行实际更改(插入或删除行)的情况下才应调用

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

答案 1 :(得分:3)

在查询完成后创建一个新的适配器,并将其设置为listview,以便在下面给出一般概念,这是gridview根据您的需求进行相应更改的示例

globalAdapter = new GridImageAdapter(getApplicationContext());
globalAdapter.notifyDataSetChanged();
grid.setAdapter(globalAdapter);
grid.invalidateViews();
相关问题