这个问题与以下内容完全相同:
我正在解析XML文件并获取listview中的信息错误。
XML解析器有以下工作代码:
private Bitmap myBitmap;
private List<SomeItem> items = new ArrayList();
XmlPullParser parser = getResources().getXml(R.xml.myxml);
try {
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
switch (parser.getEventType()){
case XmlPullParser.START_DOCUMENT:
Log.d(TAG, "Начало документа");
break;
case XmlPullParser.START_TAG:
tagname = parser.getName();
if (parser.getName().equals(iconsrc)){ //parse icon
iconsrcVALUE = parser.getAttributeValue(null, "src");
myBitmap = new AsyncForBitmap().execute(iconsrcVALUE).get();
}
if (parser.getName().equals(displayname)) {
displaynameValue = parser.nextText();
items.add(new SomeItem(displaynameValue, myBitmap));
}
break;
case XmlPullParser.TEXT :
tagtext = parser.getText();
break;
case XmlPullParser.END_TAG:
parser.getName();
break;
default:
break;
}
parser.next();
}
} catch (Throwable t) {
Toast.makeText(this,
"Error while loading XML: " + t.toString(), Toast.LENGTH_LONG)
.show();
}
在输出中,我得到了包含必要元素的listview,但这些元素并不完全正确:
...
N.前一个元素的所需文本和图像。
我想错误处理“案例”START_TAG和END_TAG。我试图结合,改变地方,但没有找到解决方案。
我如何填写listview:
SomeAdapter adapter = new SomeAdapter (this, R.layout.list_item, items);
listView.setAdapter(adapter);
位图的异步:
class AsyncForBitmap extends AsyncTask<String, Void, Bitmap> {
private Exception exception;
protected Bitmap doInBackground(String... urls) {
try {
URL url=new URL(urls[0]);
Bitmap bitmap = BitmapFactory.decodeStream((InputStream)url.getContent());
return bitmap;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
}
}
这是适配器:
public class SomeAdapter extends ArrayAdapter<SomeItem>{
private LayoutInflater inflater;
private int layout;
private List<SomeItem> items;
public SomeAdapter (Context context, int resource, List<SomeItem> items) {
super(context, resource, programmes);
this.programmes = programmes;
this.layout = resource;
this.inflater = LayoutInflater.from(context);
}
public View getView(int position, View convertView, ViewGroup parent) {
View view=inflater.inflate(this.layout, parent, false);
ImageView icon = view.findViewById(R.id.iconsrc);
TextView nameView = view.findViewById(R.id.name);
SomeItem programme = programmes.get(position);
icon.setImageBitmap(programme.getIconResource());
nameView.setText(programme.getName());
return view;
}
所以主要的问题是:我的代码有什么问题,我应该如何修复它?
我很高兴得到的不仅仅是工作代码,而是解释为什么这个或那个动作应该在一个或另一个“案例”中完成,如果“案例”中的问题。
问题是AsynsForBitmap
在您阅读下一个项目时没有完成工作,myBitmap将与下一个图像重叠。
尝试这样做(假设displayname
来自iconsrc
和SomeItem
类有一个叫做getIcon()
的方法)
case XmlPullParser.START_TAG:
tagname = parser.getName();
if (parser.getName().equals(iconsrc)){
iconsrcVALUE = parser.getAttributeValue(null, "src");
SomeItem item = new SomeItem(displaynameValue, myBitmap);
item.setName(displaynameValue);
item.add(item);
item.getIcon() = new AsyncForBitmap().execute(iconsrcVALUE).get();
}
if (parser.getName().equals(displayname)) {
displaynameValue = parser.nextText();
}
break;