rss_feed_view.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@+id/rss_list_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
rss_list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/rss_title_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginLeft="17dp"
android:layout_marginTop="14dp"
android:text="NDTV"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@android:color/black" />
</RelativeLayout>
RSSFeed.java
public class RSSFeed implements Serializable {
private String title;
private String link;
private String description;
private String category;
private String pubDate;
private String guid;
private String feedburnerOrigLink;
public RSSFeed() {
}
public RSSFeed(String title, String link, String description, String category, String pubDate,
String guid, String feedburnerOrigLink) {
this.title = title;
this.link = link;
this.description = description;
this.category = category;
this.pubDate = pubDate;
this.guid = guid;
this.feedburnerOrigLink = feedburnerOrigLink;
}
public String getTitle() {
return title;
}
public String getLink() {
return link;
}
public String getDescription() {
return description;
}
public String getCategory() {
return category;
}
public String getPubDate() {
return pubDate;
}
public String getGuid() {
return guid;
}
public String getFeedburnerOrigLink() {
return feedburnerOrigLink;
}
public void setTitle(String title) {
this.title = title;
}
public void setLink(String link) {
this.link = link;
}
public void setDescription(String description) {
this.description = description;
}
public void setCategory(String category) {
this.category = category;
}
public void setPubDate(String pubDate) {
this.pubDate = pubDate;
}
public void setGuid(String guid) {
this.guid = guid;
}
public void setFeedburnerOrigLink(String feedburnerOrigLink) {
this.feedburnerOrigLink = feedburnerOrigLink;
}
}
NewsFeedParser.java
import com.rajeshvijayakumar.model.RSSFeed;
public class NewsFeedParser {
private InputStream urlStream;
private XmlPullParserFactory factory;
private XmlPullParser parser;
private List<RSSFeed> rssFeedList;
private RSSFeed rssFeed;
private String urlString;
private String tagName;
private String title;
private String link;
private String description;
private String category;
private String pubDate;
private String guid;
private String feedburner;
public static final String ITEM = "item";
public static final String CHANNEL = "channel";
public static final String TITLE = "title";
public static final String LINK = "link";
public static final String DESCRIPTION = "description";
public static final String CATEGORY = "category";
public static final String PUBLISHEDDATE = "pubDate";
public static final String GUID = "guid";
public static final String FEEDBURNERORIGLINK = "feedburner:origLink";
public NewsFeedParser(String urlString) {
this.urlString = urlString;
}
public static InputStream downloadUrl(String urlString) throws IOException {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
InputStream stream = conn.getInputStream();
return stream;
}
public List<RSSFeed> parse() {
try {
int count = 0;
factory = XmlPullParserFactory.newInstance();
parser = factory.newPullParser();
urlStream = downloadUrl(urlString);
parser.setInput(urlStream, null);
int eventType = parser.getEventType();
boolean done = false;
rssFeed = new RSSFeed();
rssFeedList = new ArrayList<RSSFeed>();
while (eventType != XmlPullParser.END_DOCUMENT && !done) {
tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if (tagName.equals(ITEM)) {
rssFeed = new RSSFeed();
}
if (tagName.equals(TITLE)) {
title = parser.nextText().toString();
}
if (tagName.equals(LINK)) {
link = parser.nextText().toString();
}
if (tagName.equals(DESCRIPTION)) {
description = parser.nextText().toString();
}
if (tagName.equals(CATEGORY)) {
category = parser.nextText().toString();
}
if (tagName.equals(PUBLISHEDDATE)) {
pubDate = parser.nextText().toString();
}
if (tagName.equals(GUID)) {
guid = parser.nextText().toString();
}
if (tagName.equals(FEEDBURNERORIGLINK)) {
feedburner = parser.nextText().toString();
}
break;
case XmlPullParser.END_TAG:
if (tagName.equals(CHANNEL)) {
done = true;
} else if (tagName.equals(ITEM)) {
rssFeed = new RSSFeed(title, link, description, category, pubDate, guid, feedburner);
rssFeedList.add(rssFeed);
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return rssFeedList;
}
}
public class NewsFeedParser {
private InputStream urlStream;
private XmlPullParserFactory factory;
private XmlPullParser parser;
private List<RSSFeed> rssFeedList;
private RSSFeed rssFeed;
private String urlString;
private String tagName;
private String title;
private String link;
private String description;
private String category;
private String pubDate;
private String guid;
private String feedburner;
public static final String ITEM = "item";
public static final String CHANNEL = "channel";
public static final String TITLE = "title";
public static final String LINK = "link";
public static final String DESCRIPTION = "description";
public static final String CATEGORY = "category";
public static final String PUBLISHEDDATE = "pubDate";
public static final String GUID = "guid";
public static final String FEEDBURNERORIGLINK = "feedburner:origLink";
public NewsFeedParser(String urlString) {
this.urlString = urlString;
}
public static InputStream downloadUrl(String urlString) throws IOException {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
InputStream stream = conn.getInputStream();
return stream;
}
public List<RSSFeed> parse() {
try {
int count = 0;
factory = XmlPullParserFactory.newInstance();
parser = factory.newPullParser();
urlStream = downloadUrl(urlString);
parser.setInput(urlStream, null);
int eventType = parser.getEventType();
boolean done = false;
rssFeed = new RSSFeed();
rssFeedList = new ArrayList<RSSFeed>();
while (eventType != XmlPullParser.END_DOCUMENT && !done) {
tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if (tagName.equals(ITEM)) {
rssFeed = new RSSFeed();
}
if (tagName.equals(TITLE)) {
title = parser.nextText().toString();
}
if (tagName.equals(LINK)) {
link = parser.nextText().toString();
}
if (tagName.equals(DESCRIPTION)) {
description = parser.nextText().toString();
}
if (tagName.equals(CATEGORY)) {
category = parser.nextText().toString();
}
if (tagName.equals(PUBLISHEDDATE)) {
pubDate = parser.nextText().toString();
}
if (tagName.equals(GUID)) {
guid = parser.nextText().toString();
}
if (tagName.equals(FEEDBURNERORIGLINK)) {
feedburner = parser.nextText().toString();
}
break;
case XmlPullParser.END_TAG:
if (tagName.equals(CHANNEL)) {
done = true;
} else if (tagName.equals(ITEM)) {
rssFeed = new RSSFeed(title, link, description, category, pubDate, guid, feedburner);
rssFeedList.add(rssFeed);
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
e.printStackTrace();
}
return rssFeedList;
}
}
MainActivity.java
package com.rajeshvijayakumar.xmlpullparser;
import com.rajeshvijayakumar.model.RSSFeed;
import com.rajeshvijayakumar.parser.NewsFeedParser;
public class MainActivity extends Activity implements OnItemClickListener {
private ListView mRssListView;
private NewsFeedParser mNewsFeeder;
private List<RSSFeed> mRssFeedList;
private RssAdapter mRssAdap;
private static final String TOPSTORIES =
"http://feeds.feedburner.com/NdtvNews-TopStories?format=xml";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.rss_feed_view);
mRssListView = (ListView) findViewById(R.id.rss_list_view);
mRssFeedList = new ArrayList<RSSFeed>();
new DoRssFeedTask().execute(TOPSTORIES);
mRssListView.setOnItemClickListener(this);
}
private class RssAdapter extends ArrayAdapter<RSSFeed> {
private List<RSSFeed> rssFeedLst;
public RssAdapter(Context context, int textViewResourceId, List<RSSFeed> rssFeedLst) {
super(context, textViewResourceId, rssFeedLst);
this.rssFeedLst = rssFeedLst;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
RssHolder rssHolder = null;
if (convertView == null) {
view = View.inflate(MainActivity.this, R.layout.rss_list_item, null);
rssHolder = new RssHolder();
rssHolder.rssTitleView = (TextView) view.findViewById(R.id.rss_title_view);
view.setTag(rssHolder);
} else {
rssHolder = (RssHolder) view.getTag();
}
RSSFeed rssFeed = rssFeedLst.get(position);
rssHolder.rssTitleView.setText(rssFeed.getTitle());
return view;
}
}
static class RssHolder {
public TextView rssTitleView;
}
public class DoRssFeedTask extends AsyncTask<String, Void, List<RSSFeed>> {
ProgressDialog prog;
String jsonStr = null;
Handler innerHandler;
@Override
protected void onPreExecute() {
prog = new ProgressDialog(MainActivity.this);
prog.setMessage("Loading....");
prog.show();
}
@Override
protected List<RSSFeed> doInBackground(String... params) {
for (String urlVal : params) {
mNewsFeeder = new NewsFeedParser(urlVal);
}
mRssFeedList = mNewsFeeder.parse();
return mRssFeedList;
}
@Override
protected void onPostExecute(List<RSSFeed> result) {
prog.dismiss();
runOnUiThread(new Runnable() {
@Override
public void run() {
mRssAdap = new RssAdapter(MainActivity.this, R.layout.rss_list_item,
mRssFeedList);
int count = mRssAdap.getCount();
if (count != 0 && mRssAdap != null) {
mRssListView.setAdapter(mRssAdap);
}
}
});
}
@Override
protected void onProgressUpdate(Void... values) {
}
}
@Override
public void onItemClick(AdapterView<?> adapterView, View v, int position, long id) {
}
}
Add this Permission in your Manifest.xml file of your project
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Output :
Source Code : Download this Example Here
hey Rajesh i appreciate your effort ...
ReplyDeleteI am a budding Android developer and your codes are very useful...
single request --can u explain or add comments to your codes...so that it will be easier to understand.
Sure, In Future Post I will add comments for my examples
DeleteAfter loading process it left blank ..data is not parsing....i tried it with different emulators and real devices.
ReplyDelete
Deletehi tusshar kumar, Thank you for remembering me. You have to add permission for internet connection in your xml file. Previously, I missed out that and I updated this article.
thanks for replying rajesh but in your code permissions are already included...
ReplyDeleteCan you please share the complete source code to run on my eclipse..Thanks
ReplyDeleteThank you for this wonderful tutorial, please can you kindly help, i want to make each feed clickable such that when any one of the feed is clicked it can open the full article or news on another activity entirely.
ReplyDeleteA great example to learn from. Thanks Rajesh!
ReplyDeleteNot running. Is it possible that i send u the code. so , u can tell me where i went wrong?
ReplyDeleteБл* вот индусы. А XML который хранит данные, кто писать будет, я что ли?
ReplyDeletenice tutorial bor
ReplyDelete