我正在解析XML文件,并且列表视图中的信息出现错误。
以下是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();
}
在输出中,我得到一个包含必要元素的列表视图,但此元素并不完全正确:
所需的文本,没有图像;
所需的文本和图像,必须在上一个元素中;
...
N。上一个元素所需的文本和图像。
我认为对“案例” START_TAG和END_TAG的处理不当。我试图合并,更改地点,但没有找到解决方案。
我如何填充列表视图:
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;
}
所以主要问题是:我的代码中有什么问题以及应该如何解决?
我很高兴不仅能获得有效的代码,而且还能解释如果“案例”出现问题,为什么要在一个或另一个“案例”中执行此操作。
答案 0 :(得分:0)
问题是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;