XMLPullParser剪切Bitmap的最后一个元素[重复]

问题描述 投票:0回答:1

这个问题与以下内容完全相同:

我正在解析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,但这些元素并不完全正确:

  1. 所需的文字,没有图像;
  2. 所需的文本和图像,必须位于前一个元素中;

...

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;
    }

所以主要的问题是:我的代码有什么问题,我应该如何修复它?

我很高兴得到的不仅仅是工作代码,而是解释为什么这个或那个动作应该在一个或另一个“案例”中完成,如果“案例”中的问题。

android listview xmlpullparser
1个回答
0
投票

问题是AsynsForBitmap在您阅读下一个项目时没有完成工作,myBitmap将与下一个图像重叠。

尝试这样做(假设displayname来自iconsrcSomeItem类有一个叫做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;
© www.soinside.com 2019 - 2024. All rights reserved.