2

所以我有这个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 线程上调用?但我在 FragmentActivity 中,我不知道该怎么做?我可能必须创建一个可运行的线程并从那里调用它?没有对线程做太多,所以不确定,任何人都有关于如何做到这一点的好(简洁和完整)的例子?或者这甚至是我的问题?

(注意:我切换到 ORM Lite,在此之前我在这个特定的位置有一个SimpleCursorAdapter我可以在我的光标上调用 a 之后更新.requery,然后notifyDataSetChanged()

编辑:

好的,经过一些评论后,我调查了 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);
        }

仍然没有更新列表...

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

4

1 回答 1

1

事实上,你必须使 Runnable。

如何?重新输入您更新新数据的适配器(我假设您想更改列表视图中的某些内容),然后调用notifyDataSetChanged()可运行对象。确实您需要runOnUIThread(),因为您正在触发 ui 上的更新。或者使用AsyncTaskonPostExecute()onProgessUpdate()方法中更新列表视图的位置。

于 2011-07-27T02:15:14.063 回答