Проблема с растровыми элементами в XMLPullParser

Согласно поиску в 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 10.04.2019 09:49

@Ferran, я добавил информацию в вопрос

Alex Aectaniy 10.04.2019 10:21

Хорошо я понял. Пожалуйста, поделитесь своим SomeItem классом.

Ferran 10.04.2019 10:53

@Ferran, хорошо, я добавил свой класс SomeItem.

Alex Aectaniy 10.04.2019 11:04
1
4
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что 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 - почему?

Alex Aectaniy 10.04.2019 12:01

Другие вопросы по теме