所以我有这个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);
}
仍然没有更新列表...
所以我证明我不知道我在做什么:)