zoukankan      html  css  js  c++  java
  • Android RSS阅读器

    最近无意间了解到了rss,简单了解后觉得挺简单,参考了点资料写了个简单的Android版阅读器

    我试了试对常见的一些rss新闻以.xml结尾的有效其他无效,以后有时间在研究一下。


    效果图;








    具体如下;


    获取rss数据信息

    package com.rss.data;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Vector;
    
    import android.util.Log;
    
    public class RSSFeed {
    
    	private String title = null;//新闻标题  
    	private String pubdate = null;//发布时间
    	private int itemcount = 0;//数量
    	private List<RSSItem> itemlist = new Vector();//存放所有新闻
    	
    	public int addItem(RSSItem item)
    	{
    		itemlist.add(item);
    		itemcount++;
    		return itemcount;
    	}
    	public RSSItem getItem(int location)
    	{
    		return itemlist.get(location);
    	}
    	public List getAllItems()
    	{
    		return itemlist;
    	}
    	public List getAllItemsForListView(){Log.e("msg", "item size= "+itemlist.size());
    		List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
    		int size = itemlist.size();
    		for(int i=0;i<size;i++){
    			HashMap<String, Object>	item = new HashMap<String, Object>();
    			item.put(RSSItem.TITLE, itemlist.get(i).getTitle());
    			item.put(RSSItem.PUBDATE, itemlist.get(i).getPubDate());
    			data.add(item);
    		}
    		return data;
    	}
    	int getItemCount()
    	{
    		return itemcount;
    	}
    	public void setTitle(String title)
    	{
    		this.title = title;
    	}
    	public void setPubDate(String pubdate)
    	{
    		this.pubdate = pubdate;
    	}
    	public String getTitle()
    	{
    		return title;
    	}
    	public String getPubDate()
    	{
    		return pubdate;
    	}
    	
    }
    

    将信息封装成消息类

    package com.rss.data;
    
    public class RSSItem {
    	
    	public static final String TITLE="title";//两个常量用于显示在listview上的 
    	public static final String PUBDATE="pubdate";	
    	private String title = null;   //新闻标题  
        private String link = null;    //新闻链接  
        private String pubdate = null;  //新闻发布时间  
        private String description = null;  //新闻描述  
        private String category = null;     //新闻类别  
    
    	
    	public void setTitle(String title)
    	{
    		this.title = title;
    	}
    	public	void setDescription(String description)
    	{
    		this.description = description;
    	}
    	public	void setLink(String link)
    	{
    		this.link = link;
    	}
    	public	void setCategory(String category)
    	{
    		this.category = category;
    	}
    	public	void setPubDate(String pubdate)
    	{
    		this.pubdate = pubdate;
    	}
    	public String getTitle()
    	{
    		return title;
    	}
    	public	String getDescription()
    	{
    		return description;
    	}
    	public	String getLink()
    	{
    		return link;
    	}
    	public String getCategory()
    	{
    		return category;
    	}
    	public String getPubDate()
    	{
    		return pubdate;
    	}
    	@Override
    	public String toString()
    	{
    		if (title.length() > 20)
    		{
    			return title.substring(0, 42) + "...";
    		}
    		return title;
    	}
    
    }
    

    解析rss数据信息;

    package com.rss.parse;
    
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;
    
    import android.util.Log;
    
    import com.rss.data.RSSFeed;
    import com.rss.data.RSSItem;
    
    
    public class RSSHandler extends DefaultHandler {
    	
    	RSSFeed rssFeed;
    	RSSItem rssItem;
    	
    	final String ITEM_TITLE="title";
    	final String ITEM_item="item";
    	final String ITEM_link="link";
    	final String ITEM_description="description";
    	final String ITEM_data="pubDate";
    	final String ITEM_category="category";
    	final String ITEM_channel="channel";
    	
    	final int RSS_TITLE = 1;
    	final int RSS_LINK = 2;
    	final int RSS_DESCRIPTION = 3;
    	final int RSS_CATEGORY = 4;
    	final int RSS_PUBDATE = 5;
    	
    	int currentstate = 0;
    	StringBuffer theString;
    
    	public RSSHandler(){
    		rssFeed = new RSSFeed();
    		rssItem = new RSSItem();
    	}
    	public RSSFeed getFeed(){
    		return rssFeed;
    	}
    	
    	@Override
    	public void startDocument() throws SAXException{
    		super.startDocument();
    	}
    	@Override
    	public void endDocument() throws SAXException{
    		super.endDocument();
    	}
    	
    	@Override
    	public void startElement(String uri, String localName,String qName, Attributes atts) throws SAXException{
    		super.startElement(uri, localName, qName, atts);
    		
    		theString = new StringBuffer(); 
    		
    		if (localName.equals(ITEM_channel))
    		{
    			currentstate = 0;
    			return;
    		}
    		if (localName.equals(ITEM_item))
    		{
    			rssItem = new RSSItem();
    			return;
    		}
    		if (localName.equals(ITEM_TITLE))
    		{
    			currentstate = RSS_TITLE;
    			return;
    		}
    		if (localName.equals(ITEM_description))
    		{
    			currentstate = RSS_DESCRIPTION;
    			return;
    		}
    		if (localName.equals(ITEM_link))
    		{
    			currentstate = RSS_LINK;
    			return;
    		}
    		if (localName.equals(ITEM_category))
    		{
    			currentstate = RSS_CATEGORY;
    			return;
    		}
    		if (localName.equals(ITEM_data))
    		{
    			currentstate = RSS_PUBDATE;
    			return;
    		}
    		
    	}
    	
    	@Override
    	public void endElement(String namespaceURI, String localName, String qName) throws SAXException{
    		super.endElement(namespaceURI, localName, qName);
    		
    		switch (currentstate){
    			case RSS_TITLE:
    				rssItem.setTitle(theString.toString());
    				break;
    			case RSS_LINK:
    				rssItem.setLink(theString.toString());
    				break;
    			case RSS_DESCRIPTION:
    				rssItem.setDescription(theString.toString());
    				break;
    			case RSS_CATEGORY:
    				rssItem.setCategory(theString.toString());
    				break;
    			case RSS_PUBDATE:
    				rssItem.setPubDate(theString.toString());
    				break;
    			default:
    				break;
    		}
    		currentstate = 0;
    		//如果解析一个item节点结束,就将rssItem添加到rssFeed中。
    		if (localName.equals(ITEM_item))
    		{
    			rssFeed.addItem(rssItem);
    			return;
    			
    		}
    	}
    	 
    	@Override
    	public void characters(char ch[], int start, int length){
    	//	String theString = new String(ch,start,length);
    		try {
    			super.characters(ch, start, length);
    		} catch (SAXException e) {
    			e.printStackTrace();
    		}
    		
    		theString.append(ch, start, length);  
    		
    	}
    	
    }
    


    数据显示Activity;

    package com.rss.win;
    
    import java.io.IOException;
    import java.net.URL;
    
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;
    
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    
    import com.rss.data.RSSFeed;
    import com.rss.data.RSSItem;
    import com.rss.parse.RSSHandler;
    
    public class RssReadActivity extends Activity implements OnItemClickListener {
    
    	 String RSS_URL ="http://www.xinhuanet.com/world/news_world.xml";
    	public final String tag = "RSSReader";
    	private RSSFeed feed = null;
    
    	/** Called when the activity is first created. */
    
    	@Override
    	public void onCreate(Bundle icicle) {
    		super.onCreate(icicle);
    		setContentView(R.layout.main);
    		feed = getFeed(RSS_URL);
    		showListView();
    
    	}
    
    	private RSSFeed getFeed(String urlString) {
    		try {
    			URL url = new URL(urlString);
    
    			SAXParserFactory factory = SAXParserFactory.newInstance();
    			SAXParser parser = factory.newSAXParser();
    			XMLReader xmlreader = parser.getXMLReader();
    
    			RSSHandler rssHandler = new RSSHandler();
    			xmlreader.setContentHandler(rssHandler);
    
    			InputSource is = new InputSource(url.openStream());
    			xmlreader.parse(is);
    			return rssHandler.getFeed();
    		} catch(IOException e){
    			e.printStackTrace();
    		} catch (ParserConfigurationException e) {
    			e.printStackTrace();
    		} catch (SAXException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	private void showListView() {
    		ListView itemlist = (ListView) findViewById(R.id.itemlist);
    		if (feed == null) {
    			setTitle("访问的RSS无效");
    			return;
    		}
    		
    		SimpleAdapter adapter = new SimpleAdapter(this,
    				feed.getAllItemsForListView(),
    				android.R.layout.simple_list_item_2, new String[] {
    						RSSItem.TITLE, RSSItem.PUBDATE }, new int[] {
    						android.R.id.text1, android.R.id.text2 });
    		itemlist.setAdapter(adapter);
    		itemlist.setOnItemClickListener(this);
    		itemlist.setSelection(0);
    
    	}
    
    	@Override
    	public void onItemClick(AdapterView parent, View v, int position, long id) {
    		Intent itemintent = new Intent(this, ShownDescrition.class);
    
    		Bundle b = new Bundle();
    		
    		b.putString("title", feed.getItem(position).getTitle());
    		b.putString("description", feed.getItem(position).getDescription());
    		b.putString("link", feed.getItem(position).getLink());
    		b.putString("pubdate", feed.getItem(position).getPubDate());
    
    		itemintent.putExtra("android.intent.extra.rssItem", b);
    		startActivityForResult(itemintent, 0);
    	}
    
    }



    连接原文地址;

    package com.rss.win;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class ShownDescrition extends Activity {
    
    	@Override
    	public void onCreate(Bundle icicle) {
    		super.onCreate(icicle);
    		setContentView(R.layout.showdescription);
    		String content = null;
    		Intent startingIntent = getIntent();
    
    		if (startingIntent != null) {
    			Bundle bundle = startingIntent
    					.getBundleExtra("android.intent.extra.rssItem");
    			if (bundle == null) {
    				content = "app have a error";
    			} else {
    				content = bundle.getString("title") + "\n\n"
    						+ bundle.getString("description")+ "\n\n"
    						+ bundle.getString("pubdate") + "\n\n"
    						+ "\n\n详细信息请访问以下网址:\n" + bundle.getString("link");
    			}
    		} else {
    			content = "app have a error";
    
    		}
    
    		TextView textView = (TextView) findViewById(R.id.content);
    		textView.setText(content);
    
    		Button backbutton = (Button) findViewById(R.id.back);
    
    		backbutton.setOnClickListener(new Button.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				finish();
    			}
    		});
    	}
    	
    }
    


    布局文件 main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <ListView
    	android:layout_width="fill_parent"
    	android:layout_height="fill_parent"
    	android:id="@+id/itemlist"
    	
    	/>    
    </LinearLayout>
    

    布局文件 showdescription.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:autoLink="all"
        android:text=""
        android:id="@+id/content"
        android:layout_weight="1.0"
        />
    <Button
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="返回"
    	android:id="@+id/back"
    	/>    
    
    </LinearLayout>
    

    最后添加网络权限;

    <uses-permission android:name = "android.permission.INTERNET"/>


  • 相关阅读:
    Cocos2d-x学习笔记(二十五)之 加速度传感器事件
    Cocos2d-x学习笔记(二十四)之 触屏事件
    Cocos2d-x学习笔记(二十三)之 动画
    Cocos2d-x学习笔记(二十二)之 网格动作
    Cocos2d-x学习笔记(二十一)之 动作管理类CCActionManager
    Cocos2d-x学习笔记(二十)之 组合动作
    Cocos2d-x学习笔记(十九)之 缓冲动作
    Cocos2d-x学习笔记(十八)之 基本动作
    Cocos2d-x学习笔记(十七)之 动作类CCAction
    Cocos2d-x学习笔记(十六)之 定时器(时间调度)
  • 原文地址:https://www.cnblogs.com/happyxiaoyu02/p/6818979.html
Copyright © 2011-2022 走看看