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

Lou*_*too 1 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();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

mai*_*450 12

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

.notifyDataSetChanged()应该只在数据行实际更改(插入或删除行)的情况下调用,如果您刚刚更新了行上的值,则对光标上的requery()进行简单调用就足够了:

adapter.getCursor().requery();
Run Code Online (Sandbox Code Playgroud)

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

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

然后在初始化时,替换

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
    R.layout.directory_people_item, mCursor,
    new String[]{
        //snip
        new int[]{
        //snip
); 
Run Code Online (Sandbox Code Playgroud)

有:

adapter = new SimpleCursorAdapter(this,
    R.layout.directory_people_item, mCursor,
    new String[]{
        //snip
        new int[]{
        //snip
); 
Run Code Online (Sandbox Code Playgroud)