首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java (android) - RSS解析为ListView,错误??(Android开发)

Java (android) - RSS解析为ListView,错误??(Android开发)
EN

Stack Overflow用户
提问于 2018-06-21 04:34:21
回答 2查看 51关注 0票数 0

我是android开发的新手,我在Blogger.com上有博客,我想获取rss数据并将其解析到Android ListView,当我使用https://www.sammobile.com/feeds/时,它可以工作,但当我更改我博客的url地址RSS adress:https://mystat115.blogspot.com/feeds/posts/default时,它根本不起作用..只是空白的活动...

下面是我也用过的代码。

Article.Java

代码语言:javascript
复制
public class Article {

String title,description;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}
}

Connector.Java

代码语言:javascript
复制
public class Connector {

public static Object connect(String urlAddress)
{
    try
    {
        URL url=new URL(urlAddress);
        HttpURLConnection con= (HttpURLConnection) url.openConnection();

        con.setRequestMethod("GET");
        con.setConnectTimeout(15000);
        con.setReadTimeout(15000);
        con.setDoInput(true);

        return con;

    } catch (MalformedURLException e) {
        e.printStackTrace();
        return ErrorTracker.WRONG_URL_FORMAT;

    } catch (IOException e) {
        e.printStackTrace();
        return ErrorTracker.CONNECTION_ERROR;
    }
}
}

CustomAdapter.java

代码语言:javascript
复制
public class CustomAdapter extends BaseAdapter {

Context c;
ArrayList<Article> articles;

public CustomAdapter(Context c, ArrayList<Article> articles) {
    this.c = c;
    this.articles = articles;
}

@Override
public int getCount() {
    return articles.size();
}

@Override
public Object getItem(int position) {
    return articles.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView==null)
    {
        convertView= LayoutInflater.from(c).inflate(R.layout.model,parent,false);
    }

    TextView titleTxt= (TextView) convertView.findViewById(R.id.titleTxt);
    TextView descTxt= (TextView) convertView.findViewById(R.id.descTxt);

    final Article article= (Article) this.getItem(position);

    titleTxt.setText(article.getTitle());
    descTxt.setText(article.getDescription().substring(0, 120));

    convertView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(c, article.getTitle(), Toast.LENGTH_SHORT).show();
        }
    });

    return convertView;
}
}

Downloader.java

代码语言:javascript
复制
public class Downloader extends AsyncTask<Void,Void,Object> {

Context c;
String urlAddress;
ListView lv;

ProgressDialog pd;

public Downloader(Context c, String urlAddress, ListView lv) {
    this.c = c;
    this.urlAddress = urlAddress;
    this.lv = lv;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    pd=new ProgressDialog(c);
    pd.setTitle("Fetch data");
    pd.setMessage("Fetching Data...Please wait");
    pd.show();
}

@Override
protected Object doInBackground(Void... params) {
    return this.downloadData();
}

@Override
protected void onPostExecute(Object data) {
    super.onPostExecute(data);
    pd.dismiss();

    if(data.toString().startsWith("Error"))
    {
        Toast.makeText(c,data.toString(),Toast.LENGTH_SHORT).show();
    }else {
        //PARSE
        new RSSParser(c, (InputStream) data,lv).execute();
    }
}

private Object downloadData()
{
    Object connection=Connector.connect(urlAddress);
    if(connection.toString().startsWith("Error"))
    {
        return connection.toString();
    }

    try
    {
        HttpURLConnection con= (HttpURLConnection) connection;
        int responseCode=con.getResponseCode();
        if(responseCode==con.HTTP_OK)
        {
            InputStream is=new BufferedInputStream(con.getInputStream());
            return is;
        }

        return ErrorTracker.RESPONSE_ERROR+con.getResponseMessage();

    } catch (IOException e) {
        e.printStackTrace();
        return ErrorTracker.IO_EROR;
    }
}


  }

ErrorTracker.java

代码语言:javascript
复制
public class ErrorTracker {

public final static String WRONG_URL_FORMAT="Error : Wrong URL Format";
public final static String CONNECTION_ERROR="Error : Unable To Establish Connection";
public final static String IO_EROR="Error : Unable To Read";
public final static String RESPONSE_ERROR="Error : Bad Response - ";

}

RSSParser.java

代码语言:javascript
复制
public class RSSParser extends AsyncTask<Void,Void,Boolean> {

Context c;
InputStream is;
ListView lv;

ProgressDialog pd;
ArrayList<Article> articles=new ArrayList<>();

public RSSParser(Context c, InputStream is, ListView lv) {
    this.c = c;
    this.is = is;
    this.lv = lv;
}
@Override
protected void onPreExecute() {
    super.onPreExecute();
    pd=new ProgressDialog(c);
    pd.setTitle("Parse data");
    pd.setMessage("Parsing Data...Please wait");
    pd.show();
}

@Override
protected Boolean doInBackground(Void... params) {
    return this.parseRSS();
}

@Override
protected void onPostExecute(Boolean isParsed) {
    super.onPostExecute(isParsed);

    pd.dismiss();
    if(isParsed)
    {
        //BIND
        lv.setAdapter(new CustomAdapter(c,articles));
    }else {
        Toast.makeText(c,"Unable To Parse",Toast.LENGTH_SHORT).show();
    }
}

private Boolean parseRSS()
{
    try
    {
        XmlPullParserFactory factory=XmlPullParserFactory.newInstance();
        XmlPullParser parser=factory.newPullParser();

        parser.setInput(is,null);
        int event=parser.getEventType();

        String value=null;
        articles.clear();
        Article article=new Article();

        do {

            String name=parser.getName();

            switch (event)
            {
                case XmlPullParser.START_TAG:
                    if(name.equals("item"))
                    {
                        article=new Article();
                    }
                    break;

                case XmlPullParser.TEXT:
                    value=parser.getText();
                    break;

                case XmlPullParser.END_TAG:
                    if(name.equals("title"))
                    {
                        article.setTitle(value);
                    }else if(name.equals("description"))
                    {
                        article.setDescription(value);
                    }
                    if(name.equals("item"))
                    {
                        articles.add(article);
                    }

                    break;
            }

            event=parser.next();

        }while (event != XmlPullParser.END_DOCUMENT);

        return true;

    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return false;
}
}

MainActivity.java

代码语言:javascript
复制
 ListView lv = (ListView)findViewById(R.id.listView);

    new Downloader(MainActivity.this,urlAddress,lv).execute();

求你,有什么解决办法吗?请记住,它是blogger rss。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-21 13:26:27

尝试将?alt=rss添加到blogspot提要url:

代码语言:javascript
复制
https://mystat115.blogspot.com/feeds/posts/default?alt=rss
票数 0
EN

Stack Overflow用户

发布于 2018-06-21 06:23:03

注意:您的RSS使用的是Atom格式,因此请确保您的代码基于该格式。Atom specifications

有关实现RSS解析的逐步指南,请查看来自Androoid documentation的这个令人惊叹的指南。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50956623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档