Android异步XML解析

Android异步XML解析,android,xml,xml-parsing,android-asynctask,Android,Xml,Xml Parsing,Android Asynctask,我试图从url解析XML并在listview上显示它。但是,listview正在显示 像这样 [我不能直接在这里发布任何图片,因为我的声誉低于10] 这是我的密码 main活动 getRssDataTask ts = new getRssDataTask(); ts.execute("http://www.xyzapp.com/feed"); } private class getRssDataTask extends AsyncTask<String, Void, List

我试图从url解析XML并在listview上显示它。但是,listview正在显示 像这样

[我不能直接在这里发布任何图片,因为我的声誉低于10]

这是我的密码

main活动

getRssDataTask ts = new getRssDataTask();
    ts.execute("http://www.xyzapp.com/feed");
}


private class getRssDataTask extends AsyncTask<String, Void, List<NewsItem>>{

    @Override
    protected List<NewsItem> doInBackground(String... params) {
        // TODO Auto-generated method stub

        try {
                // Create RSS reader
                RSSReader rssReader = new RSSReader(params[0]);

                // Parse RSS, get items
                return rssReader.getItems();

        } catch (Exception e) {
                Log.e("App", e.getMessage());
        }

        return null;
    }

    @Override
    protected void onPostExecute(List<NewsItem> result) {

        ListView Items = (ListView) findViewById(R.id.listView);

        // Create a list adapter
        ArrayAdapter<NewsItem> rs = new ArrayAdapter<NewsItem>(local,android.R.layout.simple_list_item_1, result);
        // Set list adapter for the ListView
        Items.setAdapter(rs);
getRssDataTask ts=new getRssDataTask();
ts.execute(“http://www.xyzapp.com/feed");
}
私有类getRssDataTask扩展异步任务{
@凌驾
受保护列表doInBackground(字符串…参数){
//TODO自动生成的方法存根
试一试{
//创建RSS阅读器
RSSReader RSSReader=新RSSReader(参数[0]);
//解析RSS,获取项目
返回rssReader.getItems();
}捕获(例外e){
Log.e(“App”,e.getMessage());
}
返回null;
}
@凌驾
受保护的void onPostExecute(列表结果){
ListView项=(ListView)findViewById(R.id.ListView);
//创建一个列表适配器
ArrayAdapter rs=新的ArrayAdapter(本地,android.R.layout.simple_列表_项_1,结果);
//为ListView设置列表适配器
设置适配器(rs);
RssHandler

public class RssHandler extends DefaultHandler {

    private List<NewsItem> rssItem;

    private NewsItem currentItem;

    private boolean parsingTitle;

    private boolean parsingDes;

    public RssHandler() {
        // TODO Auto-generated constructor stub

        rssItem = new ArrayList<NewsItem>();
    }

    public List<NewsItem> getItems() {
        return rssItem;
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        if ("item".equals(qName)) {
            currentItem = new NewsItem();
        } else if ("title".equals(qName)) {
            parsingTitle = true;
        } else if ("content:encoded".equals(qName)) {
            parsingDes = true;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        if ("item".equals(qName)) {
            rssItem.add(currentItem);
            currentItem = null;
        } else if ("title".equals(qName)) {
            parsingTitle = false;
        } else if ("content:encoded".equals(qName)) {
            parsingDes = false;
        }

    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        if (parsingTitle) {
            if (currentItem != null)
                currentItem.setTitle(new String(ch, start, length));
        } else if (parsingDes) {
            if (currentItem != null) {
                currentItem.setDes(new String(ch, start, length));
                parsingDes = false;
            }
        }
    }
}
public class RSSReader {

    private String RssUrl;
    public RSSReader(String RssUrl) {
        // TODO Auto-generated constructor stub
        this.RssUrl = RssUrl;
    }

    public List<NewsItem> getItems() throws Exception{

        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

        RssHandler handler = new RssHandler();

        saxParser.parse(RssUrl, handler);

        return handler.getItems();

    }
}
公共类RssHandler扩展了DefaultHandler{
私有列表rssItem;
私人新闻项目;
私有布尔parsingtile;
私有布尔parsingDes;
公共图书馆{
//TODO自动生成的构造函数存根
rssItem=newarraylist();
}
公共列表getItems(){
返回rssItem;
}
@凌驾
public void startElement(字符串uri、字符串localName、字符串qName、,
属性)引发SAX异常{
//TODO自动生成的方法存根
如果(“项”。等于(qName)){
currentItem=新新闻项();
}else if(“title.”等于(qName)){
parsingTitle=真;
}else if(“内容:编码”。等于(qName)){
帕辛德斯=真;
}
}
@凌驾
公共void endElement(字符串uri、字符串localName、字符串qName)
抛出SAX异常{
//TODO自动生成的方法存根
如果(“项”。等于(qName)){
rssItem.add(当前项);
currentItem=null;
}else if(“title.”等于(qName)){
parsingTitle=假;
}else if(“内容:编码”。等于(qName)){
帕辛德斯=假;
}
}
@凌驾
公共无效字符(字符[]ch,整数开始,整数长度)
抛出SAX异常{
//TODO自动生成的方法存根
if(parsingtille){
如果(currentItem!=null)
currentItem.setTitle(新字符串(ch,start,length));
}否则如果(帕辛德斯){
如果(currentItem!=null){
currentItem.setDes(新字符串(ch,start,length));
帕辛德斯=假;
}
}
}
}
RssReader

public class RssHandler extends DefaultHandler {

    private List<NewsItem> rssItem;

    private NewsItem currentItem;

    private boolean parsingTitle;

    private boolean parsingDes;

    public RssHandler() {
        // TODO Auto-generated constructor stub

        rssItem = new ArrayList<NewsItem>();
    }

    public List<NewsItem> getItems() {
        return rssItem;
    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        if ("item".equals(qName)) {
            currentItem = new NewsItem();
        } else if ("title".equals(qName)) {
            parsingTitle = true;
        } else if ("content:encoded".equals(qName)) {
            parsingDes = true;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        if ("item".equals(qName)) {
            rssItem.add(currentItem);
            currentItem = null;
        } else if ("title".equals(qName)) {
            parsingTitle = false;
        } else if ("content:encoded".equals(qName)) {
            parsingDes = false;
        }

    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        if (parsingTitle) {
            if (currentItem != null)
                currentItem.setTitle(new String(ch, start, length));
        } else if (parsingDes) {
            if (currentItem != null) {
                currentItem.setDes(new String(ch, start, length));
                parsingDes = false;
            }
        }
    }
}
public class RSSReader {

    private String RssUrl;
    public RSSReader(String RssUrl) {
        // TODO Auto-generated constructor stub
        this.RssUrl = RssUrl;
    }

    public List<NewsItem> getItems() throws Exception{

        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser saxParser = factory.newSAXParser();

        RssHandler handler = new RssHandler();

        saxParser.parse(RssUrl, handler);

        return handler.getItems();

    }
}
公共类RSSReader{
私有字符串RssUrl;
公共RSSReader(字符串RssUrl){
//TODO自动生成的构造函数存根
this.RssUrl=RssUrl;
}
public List getItems()引发异常{
SAXParserFactory=SAXParserFactory.newInstance();
SAXParser SAXParser=factory.newSAXParser();
RssHandler handler=新的RssHandler();
parse(RssUrl,handler);
return handler.getItems();
}
}

我无法解决问题。我的问题是我做错了什么?

在NewsItem中实现以下方法:

@Override
public String toString() {
  // return a String value representing this object
  // Assuming two class String properties called title and description
  return title + ": " + description;
}

您需要重写
NewsItem
中的
toString()
我有两个字符串标题和描述。如何同时返回两个字符串?已编辑的答案。假设您的类中有两个字符串属性。如何创建要返回的格式化字符串值取决于您自己。我使用了“:”字符来分隔这两个字符串