Согласно поиску в stackoverflow, этот вопрос точно описывает то, что мне нужно понять сейчас, но ответов или комментариев нет, и он просматривался только 6 раз:
XMLPullParser вырезает последний элемент Bitmap
Я могу добавить к этому вопросу свою структуру XML-документа:
<name id = "92">
<display-name>Real name</display-name>
<icon src = "https://image.flaticon.com/icons/svg/25/25471.svg" />
</name>
<name id = "107">
<display-name>Real name 2</display-name>
<icon src = "https://image.flaticon.com/icons/svg/17/17004.svg" />
</name>
Парсер:
XmlPullParser parser = getResources().getXml(R.xml.myxml);
try {
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
switch (parser.getEventType()){
case XmlPullParser.START_TAG:
tagname = parser.getName();
if (parser.getName().equals(iconsrc)){
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();
}
В списке у меня есть изображения, которые начинаются с 1-го индекса списка вместо 0 индекса. Итак, в последнем элементе списка у меня есть n-1 изображение.
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;
}
Класс SomeItem:
public class SomeItem{
private String name;
private Bitmap iconsrc;
private String nameid;
public SomeItem(String name, Bitmap iconsrc, String nameid){
this.name=name;
this.iconsrc=iconsrc;
this.nameid=nameid;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getnameid() {
return this.nameid;
}
public void setnameid(String nameid) {
this.nameid = nameid;
}
public Bitmap getIconResource() {
return this.iconsrc;
}
public void setIconResource(Bitmap iconsrc) {
this.iconsrc = iconsrc;
}
}
@Ferran, я добавил информацию в вопрос
Хорошо я понял. Пожалуйста, поделитесь своим SomeItem
классом.
@Ferran, хорошо, я добавил свой класс SomeItem.
Проблема в том, что AsysForBitmap не завершает работу, пока вы читаете следующий элемент, и myBitmap будет перекрываться следующим изображением.
Попробуйте сделать это так
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.getIconResource = new AsyncForBitmap().execute(iconsrcVALUE).get();
}
if (parser.getName().equals(displayname)) {
displaynameValue = parser.nextText();
}
break;
Да, вы правы, это решило мою проблему. Только один вопрос: теперь все работает нормально, но я получаю Toast about java.lang.IndexOutOfBoundsException: 0
- почему?
Пожалуйста, задайте вопрос, касающийся вашего конкретного случая. Я не уверен, в чем твоя проблема.