【问题标题】:XMLPullParser cuts the last element of Bitmap [duplicate]XMLPullParser 剪切位图的最后一个元素[重复]
【发布时间】:2019-04-10 18:48:17
【问题描述】:

我正在解析 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();
            }

在输出中,我得到一个包含必要元素的列表视图,但这些元素并不完全正确:

  1. 想要的文字,没有图片;

  2. 想要的文字和图片,必须在前一个元素中;

...

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

所以主要问题是:我的代码出了什么问题,我应该如何解决?

如果“案例”有问题,我会很高兴不仅获得工作代码,还可以解释为什么应该在一个或另一个“案例”中执行此或那个操作。

【问题讨论】:

    标签: android listview xmlpullparser


    【解决方案1】:

    问题是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;
    

    【讨论】:

      猜你喜欢
      • 2011-07-22
      • 2017-04-08
      • 2011-08-31
      • 1970-01-01
      • 2021-03-14
      • 2014-05-21
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多