I am trying to fetch RSS news from a URL http://timesofindia.indiatimes.com/rssfeeds/1945062111.cms But I have a problem in displaying the images from this URL. Only the Title and the date are displaying but not the image.
In this image description have some tags, I don't to show them. Only content should display
My second question is how can I edit the description fetched from RSS because it is displaying some and tag. I don't want to show them in my news. Only the data should be displayed.
please show me where I should edit in this code.
package com.tandon.mynewsapp.fragments;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import com.android.volley.NetworkError;
import com.android.volley.NoConnectionError;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.ServerError;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.tandon.mynewsapp.R;
import com.tandon.mynewsapp.activity.DetailNewsActivity;
import com.tandon.mynewsapp.activity.MainActivity;
import com.tandon.mynewsapp.adapters.NewsListAdapters;
import com.tandon.mynewsapp.app.AppController;
import com.tandon.mynewsapp.models.News;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
public class LatestFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
private ListView listView;
private ArrayList<News> newsdata = new ArrayList<News>();
private NewsListAdapters newsAdapter;
SwipeRefreshLayout swipeRefreshLayout;
private boolean IsLoading=false;
//private int totalPages=1;
//private int currentPage =1;
private String[] newsUrl;
@Override
public void onRefresh() {
}
private enum RSSXMLTag {
TITLE, DATE, LINK, CONTENT, GUID, IGNORETAG,DESCRIPTION,IMAGE;
}
public LatestFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_one, container, false);
newsUrl=this.getResources().getStringArray(R.array.en_latest);
listView = (ListView) rootView.findViewById(R.id.newsList);
newsAdapter = new NewsListAdapters(getActivity(),newsdata);
listView.setAdapter(newsAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
News news = newsdata.get(i);
Intent intent = new Intent(getActivity(), DetailNewsActivity.class);
intent.putExtra("title",news.title);
intent.putExtra("description",news.description);
intent.putExtra("image",news.image);
intent.putExtra("date",news.postDate);
startActivity(intent);
}
});
for(int i=0;i<newsUrl.length;i++)
{
getNewsPosts(false,newsUrl[i]);
}
swipeRefreshLayout=(SwipeRefreshLayout) rootView.findViewById(R.id.swipereferesh);
swipeRefreshLayout.setOnRefreshListener(
new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
newsdata.clear();
for(int i=0;i<newsUrl.length;i++)
{
getNewsPosts(false,newsUrl[i]);
}
}
}
);
swipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN, Color.BLUE, Color.CYAN);
// News news1 = new News();
// news1.setTitle("Title 1");
// news1.setDescription("This is Description of news title 1 to check in program");
// newsdata.add(news1);
//
// News news2 = new News();
// news2.setTitle("Title 2");
// news2.setDescription("Description 2 for title 2 goes here");
// newsdata.add(news2);
//getNewsPosts();
// Inflate the layout for this fragment
return rootView;
}
public void getNewsPosts(final boolean isRefresh,String url)
{
if(!isRefresh) {
((MainActivity) getActivity()).showPDialog();
}
// String url = "http://www.oneindia.com/rss/news-india-fb.xml";
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("News_World",response);
((MainActivity)getActivity()).hidePDialog();
//newsdata.clear();
RSSXMLTag currentTag = null;
IsLoading = false;
if(isRefresh)
{
//newsdata.clear();
swipeRefreshLayout.setRefreshing(false);
//currentPage = 1;
}
else
{
((MainActivity)getActivity()).hidePDialog();
}
try{
// parse xml after getting the data
XmlPullParserFactory factory = XmlPullParserFactory
.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
//Abhishek Tandon Here
int currentapiVersion = android.os.Build.VERSION.SDK_INT;
if (currentapiVersion >= Build.VERSION_CODES.KITKAT) {
InputStream stream = new ByteArrayInputStream(response.getBytes(StandardCharsets.UTF_8));
xpp.setInput(stream, null);
}
else{
InputStream stream = new ByteArrayInputStream(response.getBytes(Charset.forName("UTF-8")));
xpp.setInput(stream, null);
}
int eventType = xpp.getEventType();
News newsItem = null;
//SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, DD MMM yyyy HH:mm:ss");
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
} else if (eventType == XmlPullParser.START_TAG) {
if (xpp.getName().equals("item")) {
newsItem = new News();
currentTag = RSSXMLTag.IGNORETAG;
} else if (xpp.getName().equals("title")) {
currentTag = RSSXMLTag.TITLE;
} else if (xpp.getName().equals("link")) {
currentTag = RSSXMLTag.LINK;
} else if (xpp.getName().equals("pubDate")) {
currentTag = RSSXMLTag.DATE;
}
else if(xpp.getName().equals("enclosure")||xpp.getName().equals("img")){
currentTag = RSSXMLTag.IMAGE;
newsItem.image=xpp.getAttributeValue(0);
}
else if(xpp.getName().equals("description")){
currentTag = RSSXMLTag.DESCRIPTION;
}
} else if (eventType == XmlPullParser.END_TAG) {
if (xpp.getName().equals("item")) {
// format the data here, otherwise format data in
// Adapter
// Date postDate = dateFormat.parse(newsItem.postDate);
// pdData.postDate = dateFormat.format(postDate);
newsdata.add(newsItem);
} else {
currentTag = RSSXMLTag.IGNORETAG;
}
} else if (eventType == XmlPullParser.TEXT) {
String content = xpp.getText();
content = content.trim();
Log.d("NEWS_WORLD","Content ="+ content);
//Log.d("NEWS_WORLD","date ="+ newsItem.postDate);
if (newsItem != null) {
switch (currentTag) {
case TITLE:
if (content.length() != 0) {
if (newsItem.getTitle() != null) {
newsItem.title += content;
} else {
newsItem.title = content;
}
}
break;
case DESCRIPTION:
if (content.length() != 0) {
if (newsItem.description != null) {
newsItem.description += content;
} else {
newsItem.description = content;
}
}
break;
case LINK:
if (content.length() != 0) {
if (newsItem.linkUrl != null) {
newsItem.linkUrl += content;
} else {
newsItem.linkUrl = content;
}
}
break;
case DATE:
if (content.length() != 0) {
if (newsItem.postDate != null) {
newsItem.postDate += content;
} else {
newsItem.postDate = content;
}
}
break;
default:
break;
}
}
}
eventType = xpp.next();
}
Log.v("tst", String.valueOf((newsdata.size())));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
newsAdapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
((MainActivity)getActivity()).hidePDialog();
IsLoading = false;
swipeRefreshLayout.setRefreshing(false);
if (error instanceof TimeoutError) {
Toast.makeText(getActivity(), "Request Time out error. Your internet connection is too slow to work", Toast.LENGTH_LONG).show();
} else if (error instanceof ServerError) {
Toast.makeText(getActivity(),"Connection Server error", Toast.LENGTH_LONG).show();
} else if (error instanceof NetworkError || error instanceof NoConnectionError) {
Toast.makeText(getActivity(),"Network connection error! Check your internet Setting", Toast.LENGTH_LONG).show();
}else if (error instanceof ParseError){
Toast.makeText(getActivity(), "Parsing error", Toast.LENGTH_LONG).show();
}
}
});
AppController.getInstance().addToRequestQueue(request);
}
}
/*
public void getNewsPosts()
{
((MainActivity)getActivity()).showPDialog();
String url = "http://rss.jagran.com/local/uttarakhand/almora.xml";
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("News_World",response);
((MainActivity)getActivity()).hidePDialog();
newsdata.clear();
RSSXMLTag currentTag = null;
try{
// parse xml after getting the data
XmlPullParserFactory factory = XmlPullParserFactory
.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
InputStream stream = new ByteArrayInputStream(response.getBytes(StandardCharsets.UTF_8));
xpp.setInput(stream, null);
int eventType = xpp.getEventType();
News newsItem = null;
SimpleDateFormat dateFormat = new SimpleDateFormat(
"EEE, DD MMM yyyy HH:mm:ss");
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_DOCUMENT) {
} else if (eventType == XmlPullParser.START_TAG) {
if (xpp.getName().equals("item")) {
newsItem = new News();
currentTag = RSSXMLTag.IGNORETAG;
} else if (xpp.getName().equals("title")) {
currentTag = RSSXMLTag.TITLE;
} else if (xpp.getName().equals("link")) {
currentTag = RSSXMLTag.LINK;
} else if (xpp.getName().equals("pubDate")) {
currentTag = RSSXMLTag.DATE;
}
else if(xpp.getName().equals("img")){
currentTag = RSSXMLTag.IMAGE;
}
else if(xpp.getName().equals("description")){
currentTag = RSSXMLTag.DESCRIPTION;
}
} else if (eventType == XmlPullParser.END_TAG) {
if (xpp.getName().equals("item")) {
// format the data here, otherwise format data in
// Adapter
// Date postDate = dateFormat.parse(newsItem.postDate);
// pdData.postDate = dateFormat.format(postDate);
int start = newsItem.description.indexOf("http");
int end = newsItem.description.indexOf(">");
String img = newsItem.description.substring(start, end);
Log.d("Image", img);
newsItem.image=img;
end = newsItem.description.indexOf(">");
newsItem.description= newsItem.description.substring(end + 1);
newsdata.add(newsItem);
} else {
currentTag = RSSXMLTag.IGNORETAG;
}
} else if (eventType == XmlPullParser.TEXT) {
String content = xpp.getText();
content = content.trim();
Log.d("NEWS_WORLD","Content ="+ content);
if (newsItem != null) {
switch (currentTag) {
case TITLE:
if (content.length() != 0) {
if (newsItem.getTitle() != null) {
newsItem.title += content;
} else {
newsItem.title = content;
}
}
break;
case IMAGE:
if (content.length() != 0) {
if (newsItem.image != null) {
newsItem.image += content;
} else {
newsItem.image = content;
}
}
break;
case DESCRIPTION:
if (content.length() != 0) {
if (newsItem.description != null) {
newsItem.description += content;
} else {
newsItem.description = content;
}
}
break;
case LINK:
if (content.length() != 0) {
if (newsItem.linkUrl != null) {
newsItem.linkUrl += content;
} else {
newsItem.linkUrl = content;
}
}
break;
case DATE:
if (content.length() != 0) {
if (newsItem.postDate != null) {
newsItem.postDate += content;
} else {
newsItem.postDate = content;
}
}
break;
default:
break;
}
}
}
eventType = xpp.next();
}
Log.v("tst", String.valueOf((newsdata.size())));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
newsAdapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
((MainActivity)getActivity()).hidePDialog();
if (error instanceof TimeoutError) {
Toast.makeText(getActivity(), "Request Time out error. Your internet connection is too slow to work", Toast.LENGTH_LONG).show();
} else if (error instanceof ServerError) {
Toast.makeText(getActivity(),"Connection Server error",Toast.LENGTH_LONG).show();
} else if (error instanceof NetworkError || error instanceof NoConnectionError) {
Toast.makeText(getActivity(),"Network connection error! Check your internet Setting",Toast.LENGTH_LONG).show();
}else if (error instanceof ParseError){
Toast.makeText(getActivity(),"Parsing error",Toast.LENGTH_LONG).show();
}
}
});
AppController.getInstance().addToRequestQueue(request);
}
}
*/
I am also writing a NewsListAdapter code
package com.tandon.mynewsapp.adapters;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.android.volley.toolbox.NetworkImageView;
import com.tandon.mynewsapp.R;
import com.tandon.mynewsapp.app.AppController;
import com.tandon.mynewsapp.models.News;
import java.util.List;
/**
* Created by Abhishek Tandon on 09-07-2016.
*/
public class NewsListAdapters extends BaseAdapter {
private List<News> newsdata; // bring news list data with id, title and data
private Context context; //where to display
public NewsListAdapters(Context context, List<News> list){
this.context = context;
this.newsdata = list;
}
@Override
public int getCount() {
return newsdata.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.news_row, null);
}
else{
view = convertView;
}
News news = newsdata.get(position);
TextView title = (TextView) view.findViewById(R.id.title);
TextView description = (TextView) view.findViewById(R.id.pub_date_time);
NetworkImageView image = (NetworkImageView) view.findViewById(R.id.imgview);
//Log.d("NEWS_WORLD",news.image);
image.setImageUrl(news.getImage(), AppController.getInstance().getImageLoader());
title.setText(news.getTitle());
description.setText(news.postDate);
return view;
}
}
Hi It seems they are rendering the image by writing binary data to the body. So try to download and save the image to your local folder first then bind it to image view. Below is the sample download code.
Hope it will help.
Your image URL have type : http://timesofindia.indiatimes.com/photo/507610.cms. You must be replace .cms to .jpeg before display
I solved it myself and there is no need to download any images to the user's device. Although they are rendering the image by writing binary data to the body. but I can get the image-URL from the string.
In this code I just find the right URL of image that is between "src=" and a closing tag "/>". And return this clean image to the method.
This Solved my problem. :)