Use XML over JSON when any of these is true:
- You need message validation
- You're using XSLT
- Your messages include a lot of marked-up text
- You need to interoperate with environments that don't support JSON
<?xml version="1.0" encoding="utf-8"?> <rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/"> <channel> <title>Latest News from Science Magazine</title> <link>http://www.sciencemag.org/rss/news_current.xml</link> <description>Editable in modal at Format : RSS Feed | Settings : RSS Description</description> <pubDate>Wed, 11 Oct 2017 05:51:21 -0400</pubDate> <item> <title><![CDATA[The big city is safer than the country, at least if you’re a goose]]></title> <link>http://www.sciencemag.org/news/2017/10/big-city-safer-country-least-if-you-re-goose</link> <pubDate>Wed, 11 Oct 2017 12:00:00 -0400</pubDate> <guid isPermaLink="true">http://www.sciencemag.org/news/2017/10/big-city-safer-country-least-if-you-re-goose?rss=1</guid> <description><![CDATA[City birds are twice as likely to survive the winter than their country cousins]]></description> <media:credit role="author"><![CDATA[Lakshmi Supriya]]></media:credit> <media:category><![CDATA[Biology, Climate, Plants & Animals]]></media:category> <media:content url="http://www.sciencemag.org/sites/default/files/styles/article_main_teaser/public/cc_C31FJ4_16x9.jpg?itok=ZBt2Ej2a" height="266" width="127" /> <media:thumbnail url="http://www.sciencemag.org/sites/default/files/styles/article_main_teaser/public/cc_C31FJ4_16x9.jpg?itok=ZBt2Ej2a" height="266" width="127" /> </item> <item> <title><![CDATA[Watch the human genome fold itself in four dimensions ]]></title> <link>http://www.sciencemag.org/news/2017/10/watch-human-genome-fold-itself-four-dimensions</link> <pubDate>Tue, 10 Oct 2017 09:00:00 -0400</pubDate> <guid isPermaLink="true">http://www.sciencemag.org/news/2017/10/watch-human-genome-fold-itself-four-dimensions?rss=1</guid> <description><![CDATA[Loops form and disappear to allow genes to interact]]></description> <media:credit role="author"><![CDATA[Elizabeth Pennisi]]></media:credit> <media:category><![CDATA[Biology, Health]]></media:category> <media:content url="http://www.sciencemag.org/sites/default/files/styles/article_main_teaser/public/4dchromevideo.jpg?itok=Q73Ntn43" height="266" width="127" /> <media:thumbnail url="http://www.sciencemag.org/sites/default/files/styles/article_main_teaser/public/4dchromevideo.jpg?itok=Q73Ntn43" height="266" width="127" /> </item> </channel> </rss>I Get this Output by a News website in XML format, anyone can use their link they have an Open Platform. Let's Understand the Response So, guys Lets start, 1. Create a new Project by Going to File ⇒ New Android Project. Fill all the Details and Name your Activity as MainActivity. 2. Once your Project is created successfully open your activity_main.xml file and Add Below Code.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.targetandroid.info.xmlfeed.MainActivity"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rv_feed" > </android.support.v7.widget.RecyclerView> </LinearLayout>To Populate data in Recycler view we have to Make a POJO class Name it as FeedItem.java 3. Create a POJO class FeedItem.java and Add Below Code
/** * Created by Faizan on 09/04/17. */ public class FeedItem { String title; String link; String description; String pubDate; String thumbnailUrl; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getLink() { return link; } public void setLink(String link) { this.link = link; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPubDate() { return pubDate; } public void setPubDate(String pubDate) { this.pubDate = pubDate; } public String getThumbnailUrl() { return thumbnailUrl; } public void setThumbnailUrl(String thumbnailUrl) { this.thumbnailUrl = thumbnailUrl; } }To Display Data we have to create a custom layout for recylerview so we can decide how every single Item will display on the screen. So create a layout file, I ready discussed how to create a layout file in the previous tutorial of recyclerview 4. Create a layout file and add below code into that
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:paddingTop="16dp" android:paddingLeft="16dp" android:paddingRight="16dp" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv_title" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv_desc" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv_pubdate" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tv_link" android:textColor="@android:color/holo_blue_dark" /> </LinearLayout>Here we are getting a Link ,in our response, to read the full news. so we have to open that link in Webview so for that we have to create a new Activity which Contains WebView and can open our Link. I already covered a brief tutorial on Webview you can check it out fromhere. 5. Create a new Activity Name it as WebViewActivity.java and add below xml code in activity_web_view.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.targetandroid.info.xmlfeed.WebViewActivity"> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/wv_url" > </WebView> </LinearLayout>6. Now open WebViewActivity.java and add below code
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient; public class WebViewActivity extends AppCompatActivity { String webviewurl; WebView wv_url; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); //here we will get the url passed by previous activity webviewurl=getIntent().getStringExtra("url"); wv_url=(WebView)findViewById(R.id.wv_url); wv_url.setWebViewClient(new WebViewClient()); //load the url in Webview wv_url.loadUrl(webviewurl); } }7. Create an Adapter For RecyclerView name it as MyRVAdapter.java
import android.content.Context; import android.content.Intent; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; /** * Created by Faizan on 09/19/17. */ public class MyRVAdapter extends RecyclerView.Adapter<MyRVAdapter.MyViewHolder> { private List<FeedItem> feedItems; private Context context; public MyRVAdapter(Context context,List<FeedItem> items){ this.context=context; this.feedItems = items; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); final View view = inflater.inflate(R.layout.customlayout, parent, false); MyViewHolder mvh = new MyViewHolder(view, new MyViewHolder.myClickWebView() { @Override public void gotoWebView(String textlink) { Intent intent=new Intent(context,WebViewActivity.class); //Send the url to webviewActivity intent.putExtra("url",textlink); context.startActivity(intent); } }); return mvh; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { FeedItem item = feedItems.get(position); holder.tv_desc.setText(item.getDescription()); holder.tv_link.setText(item.getLink()); holder.tv_pubdate.setText(item.getPubDate()); holder.tv_title.setText(item.getTitle()); //get the link holder.textlink=item.getLink(); } @Override public int getItemCount() { return feedItems==null?0:feedItems.size(); } public static class MyViewHolder extends RecyclerView.ViewHolder{ TextView tv_title, tv_desc, tv_pubdate, tv_link; String textlink; myClickWebView myClickWebView; public MyViewHolder(View itemView, final myClickWebView myClickWebView) { super(itemView); tv_title=(TextView)itemView.findViewById(R.id.tv_title); tv_desc=(TextView)itemView.findViewById(R.id.tv_desc); tv_pubdate=(TextView)itemView.findViewById(R.id.tv_pubdate); tv_link=(TextView)itemView.findViewById(R.id.tv_link); this.myClickWebView=myClickWebView; itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { myClickWebView.gotoWebView(textlink); } }); /* tv_link.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent=new Intent(context,WebViewActivity.class); } });*/ } //interface to handle onclick event and send some extras to another activity public interface myClickWebView{ void gotoWebView(String textlink); } } }8. Now finally Come to MainActivity.java and Call the HTTP Request to get the Response and Parse it
import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class MainActivity extends AppCompatActivity { ArrayList<FeedItem> feedItems=new ArrayList<>(); RecyclerView rv_test; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rv_test=(RecyclerView) findViewById(R.id.rv_test); ReadRss readRss=new ReadRss(this); //call Http request using Async Task readRss.execute(); } public class ReadRss extends AsyncTask<Void, Void, Void> { Context context; String address = "http://www.sciencemag.org/rss/news_current.xml"; ProgressDialog progressDialog; URL url; public ReadRss(Context context) { this.context = context; progressDialog = new ProgressDialog(context); progressDialog.setMessage("Loading..."); } @Override protected void onPreExecute() { progressDialog.show(); super.onPreExecute(); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); progressDialog.dismiss(); } @Override protected Void doInBackground(Void... params) { ProcessXml(Getdata()); //Every View run on Ui Thread and doInBackground runs in Background thread runOnUiThread(new Runnable() { @Override public void run() { rv_test.setAdapter(new MyRVAdapter(MainActivity.this,feedItems)); rv_test.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false)); } }); return null; } //Parse the XML response and Pass it to Recycler View private void ProcessXml(Document data) { if (data != null) { Element root = data.getDocumentElement(); Node channel = root.getChildNodes().item(1); NodeList items = channel.getChildNodes(); for (int i = 0; i < items.getLength(); i++) { Node cureentchild = items.item(i); if (cureentchild.getNodeName().equalsIgnoreCase("item")) { FeedItem item=new FeedItem(); NodeList itemchilds = cureentchild.getChildNodes(); for (int j = 0; j < itemchilds.getLength(); j++) { Node cureent = itemchilds.item(j); if (cureent.getNodeName().equalsIgnoreCase("title")){ item.setTitle(cureent.getTextContent()); }else if (cureent.getNodeName().equalsIgnoreCase("description")){ item.setDescription(cureent.getTextContent()); }else if (cureent.getNodeName().equalsIgnoreCase("pubDate")){ item.setPubDate(cureent.getTextContent()); }else if (cureent.getNodeName().equalsIgnoreCase("link")){ item.setLink(cureent.getTextContent()); } } feedItems.add(item); Log.d("itemTitle", item.getTitle()); Log.d("itemDescription",item.getDescription()); Log.d("itemPubDate",item.getPubDate()); Log.d("itemLink",item.getLink()); } } } } //Call the Http GET Request and //Return the XML response in Document Format public Document Getdata() { try { url = new URL(address); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); InputStream inputStream = connection.getInputStream(); DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = builderFactory.newDocumentBuilder(); Document xmlDoc = builder.parse(inputStream); return xmlDoc; } catch (Exception e) { e.printStackTrace(); return null; } } } }9. Add a Internet Permission into AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />10. Now run your Project you will see a below output
For More Awesome Tutorial on Android Subscribe to My Blog and Share this with all your Colleague.
Thank You
0 comments:
Post a Comment