所以我有这个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);
}
仍未对列表进行更新......
所以我证明我不知道我在做什么:)
答案 0 :(得分:1)
确实,你必须制作Runnable。
如何?重新提供更新新数据的适配器(我假设您要更改列表视图中的内容),然后在runnable中调用notifyDataSetChanged()
。确实,您需要runOnUIThread()
,因为您正在触发ui的更新。或者使用AsyncTask
在onPostExecute()
或onProgessUpdate()
方法中更新列表视图。