我正在尝试在填充列表视图时显示ProgressBar。
这是我的XML
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:divider="@null"
android:dividerHeight="0dp"
android:fadingEdge="none" >
</ListView>
<ProgressBar
android:id="@+id/doProgress"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center" />
</FrameLayout>
当加载整个列表视图时,onPostExecuteMethod中的ProgressBar的visibiliy已被更改。 AsyncTask代码:
public class WhatToDoLoader extends AsyncTask<String, String, String> {
ProgressDialog progress = new ProgressDialog(WhatToDo.this);
String url = "http://wearedesigners.net/clients/clients12/tourism/fetchWhatToDoList.php";
final String TAG_MAIN = "item";
final String TAG_ID = "itemId";
final String TAG_NAME = "itemName";
final String TAG_DETAIL = "itemDetailText";
final String TAG_ITEM_IMAGE = "itemImages";
final String TAG_MAP = "itemMapData";
final String TAG_MAP_IMAGE = "mapImage";
@Override
protected void onProgressUpdate(String... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
adapter.notifyDataSetChanged();
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
/*
* progress.setMessage("Loading What To Do List"); progress.show();
*/
}
@Override
protected String doInBackground(String... params) {
XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(url); // getting XML
Document doc = parser.getDomElement(xml); // getting DOM element
NodeList nl = doc.getElementsByTagName(TAG_MAIN);
// TODO Auto-generated method stub
for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
map.put(TAG_ID, parser.getValue(e, TAG_ID));
map.put(TAG_NAME, parser.getValue(e, TAG_NAME));
map.put(TAG_DETAIL, parser.getValue(e, TAG_DETAIL));
map.put(TAG_MAP, parser.getValue(e, TAG_MAP));
map.put(TAG_MAP_IMAGE, parser.getValue(e, TAG_MAP_IMAGE));
map.put(TAG_ITEM_IMAGE, parser.getValue(e, TAG_ITEM_IMAGE));
System.out.println("Test : " + parser.getValue(e, TAG_ID));
// adding HashList to ArrayList
whatToDoInfo.add(map);
publishProgress("");
}
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
ProgressBar pb = (ProgressBar) findViewById(R.id.doProgress);
pb.setVisibility(pb.INVISIBLE);
}
}
当我运行代码时,它会抛出以下异常。
* java.lang.IllegalStateException:适配器的内容已更改,但ListView未收到通知。确保不从后台线程修改适配器的内容,而只是从UI线程修改。 *
但是当省略进度条功能时,相同的代码可以正常工作。我找不到我错的地方。有人可以帮帮我吗 ?
提前谢谢你。
答案 0 :(得分:0)
只需检查:在调用WhatToDoLoader之前,将适配器设置为listview,对吧?
否则,在将适配器设置为listview之前可能会调用onProgressUpdate方法,并且您的列表未收到通知......因此可能会发生此错误。