通过notifydataSetChanged更新ListView,必须使用runOnUiThread吗?

时间:2011-07-26 22:30:59

标签: android android-listview android-adapter

所以我有这个ListView,它使用我自己的自定义arrayadapter。它工作得很好,从数据库等获取数据,但在设置之后没有更新它。我有这个活动为结果做了一些事情,当它回来时我称之为:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) 
    {
        super.onActivityResult(requestCode, resultCode, data);          
        if(requestCode==1899)
        {       
            //a new client was added to the list...
            try {
                clients = (ArrayList<ClientsData>) clientsDataDao.queryForAll();
            } catch (SQLException e) {
                // TODO Auto-generated catch block

            }                           
            theClients.notifyDataSetChanged(); //this is not working here                           
            showClientDetails(mCurrentSelectedItemIndex); //update other fragment.
        }
    }

问题是notifyDataSetChanged()实际上没有做任何事情。我进一步调查了,我想它必须在UI线程上调用?但我在片段活动中,我不知道该怎么做?我可能必须创建一个可运行的线程并从那里调用它?没有做过很多线程所以不确定,任何人都有关于如何做到这一点的好(简洁和完整)的例子?或者这甚至是我的问题?

(注意:我之前已经切换到ORM Lite,在此特定位置SimpleCursorAdapter之前我可以在我的光标上调用.requery后再更新notifyDataSetChanged() < / p>

编辑:

好的,经过几次评论后我调查了AsyncTask路线......:

private class addViewsToList extends AsyncTask<Void, Void, Boolean>{
         protected void onPostExecute(Boolean result) {
                theClients.notifyDataSetChanged();
            }
        @Override
        protected Boolean doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return true;
        }         
    }

和我的onActivityCreated

new addViewsToList().execute();

和我的onActivityResult(...)

super.onActivityResult(requestCode, resultCode, data);          
        if(requestCode==1899)
        {       
            //a new client was added to the list...
            try {
                clients = (ArrayList<ClientsData>) clientsDataDao.queryForAll();
            } catch (SQLException e) {
                // TODO Auto-generated catch block

            }       
                            //do I have to reset the adapter?   
            setListAdapter(theClients);             
                        showClientDetails(mCurrentSelectedItemIndex);
        }

仍未对列表进行更新......

所以我证明我不知道我在做什么:)

1 个答案:

答案 0 :(得分:1)

确实,你必须制作Runnable。

如何?重新提供更新新数据的适配器(我假设您要更改列表视图中的内容),然后在runnable中调用notifyDataSetChanged()。确实,您需要runOnUIThread(),因为您正在触发ui的更新。或者使用AsyncTaskonPostExecute()onProgessUpdate()方法中更新列表视图。