Pembaca Feed RSS di Android

RSS adalah singkatan dari Rich Site Summary. Ini digunakan untuk membaca pembaruan terbaru yang dibuat pada konten blog atau situs web. RSS feed sebagian besar digunakan untuk membaca ringkasan blog (newsletter). Konten untuk RSS feed disediakan dalam xml format.

Xml format untuk RSS reader berisi tag berikut.

<channel>  
    <title></title>  
    <link></link>  
    <description></description>  
    <item>  
        <title></title>  
        <link></link>  
        <pubDate></pubDate>  
        <description></description>  
    </item>  
    <item>  
    .  
    .  
    .  
    .  
    </item>  
</channel>  


Dalam tutorial ini, kita akan membaca konten situs web (Rediff.com dan Cinemablend.com) menggunakan pembaca Rss Feed Android. Konten ditampilkan di ListView android dan mengklik item ini akan memuat URL masing-masing.

Contoh Pembaca Umpan RSS Android Buat aktivitas MainActivity.java dengan kode berikut. Mengklik tombol pengalihan aktivitas ini ke kelas RSSFeedActivity.java dan memuat konten URL tertentu.

File : activity_main.xml

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent">  
 
    <Button  
        android:id="@+id/btnRediff"  
        android:layout_width="300dp"  
        android:layout_height="wrap_content"  
        android:layout_alignParentBottom="true"  
        android:layout_centerHorizontal="true"  
        android:layout_marginBottom="101dp"  
        android:text="REDIFF RSS FEED" />  
 
    <Button  
        android:id="@+id/btnCinemaBlend"  
        android:layout_width="300dp"  
        android:layout_height="wrap_content"  
        android:layout_alignLeft="@+id/btnRediff"  
        android:layout_alignParentBottom="true"  
        android:layout_alignStart="@+id/btnRediff"  
        android:layout_marginBottom="28dp"  
        android:text="CINEMA BLEND RSS FEED" />  
</RelativeLayout>  


File : MainActivity.java

package example.android.com.androidrssfeed;  
 
import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.content.Intent;  
import android.view.View;  
import android.widget.Button;  
import java.util.ArrayList;  
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {  
 
    ArrayList<String> rssLinks = new ArrayList<>();  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
 
        Button btnRediff = findViewById(R.id.btnRediff);  
        Button btnCinemaBlend = findViewById(R.id.btnCinemaBlend);  
        btnRediff.setOnClickListener(this);  
        btnCinemaBlend.setOnClickListener(this);  
        rssLinks.add("http://www.rediff.com/rss/moviesreviewsrss.xml");  
        rssLinks.add("http://www.cinemablend.com/rss_review.php");  
    }  
 
    @Override  
    public void onClick(View view) {  
        Intent intent = new Intent(getApplicationContext(), RSSFeedActivity.class);  
        switch (view.getId()) {  
            case R.id.btnRediff:  
                intent.putExtra("rssLink", rssLinks.get(0));  
                startActivity(intent);  
                break;  
            case R.id.btnCinemaBlend:  
                intent.putExtra("rssLink", rssLinks.get(1));  
                startActivity(intent);  
                break;  
        }  
    }  
}  


Buat layout rss_item_list_row.xml yang berisi bidang buletin (URL halaman, judul, tanggal penerbitan) yang ditampilkan di Umpan RSS.

File : rss_item_list_row.xml

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:padding="8dip">  
 
    <TextView  
        android:id="@+id/page_url"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:visibility="gone" />  
 
    <TextView  
        android:id="@+id/title"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"  
        android:paddingBottom="1dip"  
        android:textColor="#212121"  
        android:textSize="18sp"  
        android:textStyle="bold" />  
 
    <TextView  
        android:id="@+id/pub_date"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:layout_below="@id/title"  
        android:paddingBottom="3dip"  
        android:textColor="#9b737775"  
        android:textSize="14sp" />  
 
</RelativeLayout>  


File : RSSItem.java

package example.android.com.androidrssfeed;  
 
public class RSSItem {  
    public String title;  
    public String link;  
    public String description;  
    public String pubdate;  
    public String guid;  
 
    public RSSItem(String title, String link, String description, String pubdate, String guid) {  
        this.title = title;  
        this.link = link;  
        this.description = description;  
        this.pubdate = pubdate;  
        this.guid = guid;  
    }  
}  


Buat kelas RSSParser.java, di kelas ini; kita akan menggunakan instance kelas DocumentBuilderFactory untuk mengurai dokumen XML.

File : RSSParser.java

package example.android.com.androidrssfeed;  
 
import android.util.Log;  
import org.apache.http.HttpEntity;  
import org.apache.http.HttpResponse;  
import org.apache.http.client.ClientProtocolException;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.apache.http.util.EntityUtils;  
import org.w3c.dom.Document;  
import org.w3c.dom.Element;  
import org.w3c.dom.Node;  
import org.w3c.dom.NodeList;  
import org.xml.sax.InputSource;  
import org.xml.sax.SAXException;  
 
import java.io.IOException;  
import java.io.StringReader;  
import java.io.UnsupportedEncodingException;  
import java.util.ArrayList;  
import java.util.List;  
 
import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
import javax.xml.parsers.ParserConfigurationException;  
 
public class RSSParser {  
 
    // RSS XML document CHANNEL tag  
    private static String TAG_CHANNEL = "channel";  
    private static String TAG_TITLE = "title";  
    private static String TAG_LINK = "link";  
    private static String TAG_DESRIPTION = "description";  
    private static String TAG_ITEM = "item";  
    private static String TAG_PUB_DATE = "pubDate";  
    private static String TAG_GUID = "guid";  
 
    public RSSParser() {  
    }  
 
    public List<RSSItem> getRSSFeedItems(String rss_url) {  
        List<RSSItem> itemsList = new ArrayList<RSSItem>();  
        String rss_feed_xml;  
 
        rss_feed_xml = this.getXmlFromUrl(rss_url);  
        if (rss_feed_xml != null) {  
            try {  
                Document doc = this.getDomElement(rss_feed_xml);  
                NodeList nodeList = doc.getElementsByTagName(TAG_CHANNEL);  
                Element e = (Element) nodeList.item(0);  
 
                NodeList items = e.getElementsByTagName(TAG_ITEM);  
                for (int i = 0; i < items.getLength(); i++) {  
                    Element e1 = (Element) items.item(i);  
 
                    String title = this.getValue(e1, TAG_TITLE);  
                    String link = this.getValue(e1, TAG_LINK);  
                    String description = this.getValue(e1, TAG_DESRIPTION);  
                    String pubdate = this.getValue(e1, TAG_PUB_DATE);  
                    String guid = this.getValue(e1, TAG_GUID);  
 
                    RSSItem rssItem = new RSSItem(title, link, description, pubdate, guid);  
                    // adding item to list  
                    itemsList.add(rssItem);  
                }  
            } catch (Exception e) {  
                // Check log for errors  
                e.printStackTrace();  
            }  
        }  
        return itemsList;  
    }  
 
 
    public String getXmlFromUrl(String url) {  
        String xml = null;  
        try {  
            DefaultHttpClient httpClient = new DefaultHttpClient();  
            HttpGet httpGet = new HttpGet(url);  
            HttpResponse httpResponse = httpClient.execute(httpGet);  
            HttpEntity httpEntity = httpResponse.getEntity();  
            xml = EntityUtils.toString(httpEntity);  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        } catch (ClientProtocolException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return xml;  
    }  
 
    public Document getDomElement(String xml) {  
        Document doc = null;  
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
        try {  
 
            DocumentBuilder db = dbf.newDocumentBuilder();  
            InputSource is = new InputSource();  
            is.setCharacterStream(new StringReader(xml));  
            doc = db.parse(is);  
        } catch (ParserConfigurationException e) {  
            Log.e("Error: ", e.getMessage());  
            return null;  
        } catch (SAXException e) {  
            Log.e("Error: ", e.getMessage());  
            return null;  
        } catch (IOException e) {  
            Log.e("Error: ", e.getMessage());  
            return null;  
        }  
        return doc;  
    }  
 
    public final String getElementValue(Node elem) {  
        Node child;  
        if (elem != null) {  
            if (elem.hasChildNodes()) {  
                for (child = elem.getFirstChild(); child != null; child = child  
                        .getNextSibling()) {  
                    if (child.getNodeType() == Node.TEXT_NODE || (child.getNodeType() == Node.CDATA_SECTION_NODE)) {  
                        return child.getNodeValue();  
                    }  
                }  
            }  
        }  
        return "";  
    }  
 
    public String getValue(Element item, String str) {  
        NodeList n = item.getElementsByTagName(str);  
        return this.getElementValue(n.item(0));  
    }  
}  


Sekarang, buat aktivitas RSSFeedActivity.java dengan kode berikut. Kelas ini menggunakan kelas AsyncTask untuk memuat item RSS Feed dari URL di latar belakang.

File : activity_rssfeed.xml

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:id="@+id/relativeLayout"  
    android:orientation="vertical">  
 
    <ListView  
        android:id="@android:id/list"  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:dividerHeight="1dp" />  
</RelativeLayout>  


File : RSSFeedActivity.java

package example.android.com.androidrssfeed;  
 
import android.app.ListActivity;  
import android.content.Intent;  
import android.os.AsyncTask;  
import android.os.Bundle;  
import android.view.View;  
import android.widget.AdapterView;  
import android.widget.ListAdapter;  
import android.widget.ListView;  
import android.widget.ProgressBar;  
import android.widget.RelativeLayout;  
import android.widget.SimpleAdapter;  
import android.widget.TextView;  
import android.widget.Toast;  
 
import java.text.ParseException;  
import java.text.SimpleDateFormat;  
import java.util.ArrayList;  
import java.util.Date;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Locale;  
 
public class RSSFeedActivity extends ListActivity {  
 
    private ProgressBar pDialog;  
    ArrayList<HashMap<String, String>> rssItemList = new ArrayList<>();  
    RSSParser rssParser = new RSSParser();  
    List<RSSItem> rssItems = new ArrayList<>();  
    private static String TAG_TITLE = "title";  
    private static String TAG_LINK = "link";  
    private static String TAG_PUB_DATE = "pubDate";  
 
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_rssfeed);  
 
        String rss_link = getIntent().getStringExtra("rssLink");  
        new LoadRSSFeedItems().execute(rss_link);  
        ListView lv = getListView();  
 
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
 
            public void onItemClick(AdapterView<?> parent, View view,  
                                    int position, long id) {  
                Intent in = new Intent(getApplicationContext(), WebActivity.class);  
                String page_url = ((TextView) view.findViewById(R.id.page_url)).getText().toString().trim();  
                in.putExtra("url", page_url);  
                startActivity(in);  
            }  
        });  
    }  
 
    public class LoadRSSFeedItems extends AsyncTask<String, String, String> {  
 
        @Override  
        protected void onPreExecute() {  
            super.onPreExecute();  
            pDialog = new ProgressBar(RSSFeedActivity.this, null, android.R.attr.progressBarStyleLarge);  
            RelativeLayout relativeLayout = findViewById(R.id.relativeLayout);  
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(  
                    RelativeLayout.LayoutParams.WRAP_CONTENT,  
                    RelativeLayout.LayoutParams.WRAP_CONTENT  
            );  
 
            layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);  
            pDialog.setLayoutParams(layoutParams);  
            pDialog.setVisibility(View.VISIBLE);  
            relativeLayout.addView(pDialog);  
        }  
 
        @Override  
        protected String doInBackground(String... args) {  
            // rss link url  
            String rss_url = args[0];  
            // list of rss items  
            rssItems = rssParser.getRSSFeedItems(rss_url);  
            // looping through each item  
            for (final RSSItem item : rssItems) {  
                // creating new HashMap  
                if (item.link.toString().equals(""))  
                    break;  
                HashMap<String, String> map = new HashMap<String, String>();  
 
                // adding each child node to HashMap key => value  
                String givenDateString = item.pubdate.trim();  
                SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");  
                try {  
                    Date mDate = sdf.parse(givenDateString);  
                    SimpleDateFormat sdf2 = new SimpleDateFormat("EEEE, dd MMMM yyyy - hh:mm a", Locale.US);  
                    item.pubdate = sdf2.format(mDate);  
 
                } catch (ParseException e) {  
                    e.printStackTrace();  
 
                }  
 
                map.put(TAG_TITLE, item.title);  
                map.put(TAG_LINK, item.link);  
                map.put(TAG_PUB_DATE, item.pubdate);  
                // adding HashList to ArrayList  
                rssItemList.add(map);  
            }  
 
            // updating UI from Background Thread  
            runOnUiThread(new Runnable() {  
                public void run() {  
                    ListAdapter adapter = new SimpleAdapter(  
                            RSSFeedActivity.this,  
                            rssItemList, R.layout.rss_item_list_row,  
                            new String[]{TAG_LINK, TAG_TITLE, TAG_PUB_DATE},  
                            new int[]{R.id.page_url, R.id.title, R.id.pub_date});  
 
                    // updating listview  
                    setListAdapter(adapter);  
                }  
            });  
            return null;  
        }  
 
        protected void onPostExecute(String args) {  
            pDialog.setVisibility(View.GONE);   
        }  
    }  
}  


Buat aktivitas WebActivity.java yang berisi WebView, yang memuat konten tautan yang diklik dalam aktivitas sebelumnya.

File : activity_web.xml

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:id="@+id/relativeLayout"  
    android:layout_height="match_parent">  
 
    <android.support.v4.widget.NestedScrollView  
        android:layout_width="match_parent"  
        android:layout_height="match_parent">  
 
        <WebView  
            android:id="@+id/webView"  
            android:layout_width="match_parent"  
            android:layout_height="match_parent" />  
 
    </android.support.v4.widget.NestedScrollView>  
</RelativeLayout>  


File : WebActivity.java

package example.android.com.androidrssfeed;  
 
import android.content.Context;  
import android.content.Intent;  
import android.graphics.Bitmap;  
import android.os.Bundle;  
import android.support.v7.app.AppCompatActivity;  
import android.text.TextUtils;  
import android.webkit.WebChromeClient;  
import android.webkit.WebResourceError;  
import android.webkit.WebResourceRequest;  
import android.webkit.WebView;  
import android.webkit.WebViewClient;  
import android.widget.Toast;  
 
public class WebActivity extends AppCompatActivity {  
 
    WebView webView;  
    String url;  
 
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_web);  
        Intent in = getIntent();  
        url = in.getStringExtra("url");  
        if (TextUtils.isEmpty(url)) {  
            Toast.makeText(getApplicationContext(), "URL not found", Toast.LENGTH_SHORT).show();  
            finish();  
        }  
        webView = findViewById(R.id.webView);  
        initWebView();  
        webView.loadUrl(url);  
    }  
 
    private void initWebView() {  
        webView.setWebChromeClient(new MyWebChromeClient(this));  
        webView.clearCache(true);  
        webView.getSettings().setJavaScriptEnabled(true);  
        webView.setHorizontalScrollBarEnabled(false);  
        webView.setWebViewClient(new WebViewClient() {  
            @Override  
            public void onPageStarted(WebView view, String url, Bitmap favicon) {  
                super.onPageStarted(view, url, favicon);  
            }  
            @Override  
            public boolean shouldOverrideUrlLoading(WebView view, String url) {  
                webView.loadUrl(url);  
                return true;  
            }  
            @Override  
            public void onPageFinished(WebView view, String url) {  
                super.onPageFinished(view, url);  
            }  
            @Override  
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {  
                super.onReceivedError(view, request, error);  
                invalidateOptionsMenu();  
            }  
        });  
        webView.clearCache(true);  
        webView.clearHistory();  
        webView.getSettings().setJavaScriptEnabled(true);  
        webView.setHorizontalScrollBarEnabled(false);  
    }  
 
    private class MyWebChromeClient extends WebChromeClient {  
        Context context;  
        public MyWebChromeClient(Context context) {  
            super();  
            this.context = context;  
        }  
    }  
}  


Izin Diperlukan

Tambahkan izin INTERNET dalam file AndroidMenifest.xml.

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


Pembaca Feed RSS Android


Berlangganan update artikel terbaru via email:

0 Response to "Pembaca Feed RSS di Android"

Posting Komentar

Iklan Atas Artikel

Iklan Bawah Artikel