I have an RSS feed, which when I've changed the source of the feed it crashes with an error:
Attempt to invoke virtual method 'int java.util.ArrayList.size()' on a null object reference.
I've looked through my new link and to my logic it should still work (all the nodes are pretty much the same etc) but for some reason it doesn't.
Ideally I'd like to use both links together. Which is possible with my code as I've used two links together before.
Any ideas why this isn't working?
New link (that I'm trying to use): https://feeds.finance.yahoo.com/rss/2.0/headline?s=yhoo,msft,tivo®ion=US&lang=en-US
Old link: https://www.bloomberg.com/politics/feeds/site.xml
RSSFeed.java:
public class ReadRss extends AsyncTask<Void,Void,Void>{
ArrayList<FeedItem>feedItems;
RecyclerView recyclerView;
Context context;
static ArrayList<String>address;
static {
address=new ArrayList<>();
address.add("http://finance.yahoo.com/rss/headline?s=yhoo,msft,tivo");
//address.add("https://www.bloomberg.com/politics/feeds/site.xml");
//address.add("https://www.bloomberg.com/feeds/podcasts/etf_report.xml");
}
ProgressDialog progressDialog;
URL url;
public ReadRss(Context context, RecyclerView recyclerView){
this.recyclerView=recyclerView;
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();
MyAdapter adapter=new MyAdapter(context,feedItems);
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerView.addItemDecoration(new VerticalSpace(50));
recyclerView.setAdapter(adapter);
}
@Override
protected Void doInBackground(Void... params) {
ProcessXml(Getdata());
return null;
}
private void ProcessXml(ArrayList<Document> data) {
if (data != null) {
feedItems = new ArrayList<>();
for (Document doc : data) {
Element root = doc.getDocumentElement();
Node channel = root.getChildNodes().item(0);
NodeList items = channel.getChildNodes();
for (int i = 0; i < items.getLength(); i++) {
Node currentchild = items.item(i);
if (currentchild.getNodeName().equalsIgnoreCase("item")) {
FeedItem item = new FeedItem();
NodeList itemchilds = currentchild.getChildNodes();
for (int j = 0; j < itemchilds.getLength(); j++) {
Node current = itemchilds.item(j);
if (current.getNodeName().equalsIgnoreCase("title")) {
item.setTitle(current.getTextContent());
} else if (current.getNodeName().equalsIgnoreCase("description")) {
item.setDescription(current.getTextContent());
} else if (current.getNodeName().equalsIgnoreCase("pubDate")) {
item.setPubDate(current.getTextContent());
} else if (current.getNodeName().equalsIgnoreCase("link")) {
item.setLink(current.getTextContent());
}
}
feedItems.add(item);
Log.d("itemTitle", item.getTitle());
Log.d("itemDescription", item.getTitle());
Log.d("itemLink", item.getTitle());
Log.d("itemPubDate", item.getTitle());
}
}
}
}
}
public ArrayList<Document> Getdata(){
ArrayList<Document> documents = new ArrayList<>();
for (String addr: address) {
try {
url = new URL(addr);
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);
documents.add(xmlDoc);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
return documents;
}
}
MyAdapter.java:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
ArrayList<FeedItem>feedItems;
Context context;
public MyAdapter(Context context,ArrayList<FeedItem>afeedItems){
this.feedItems= new ArrayList<FeedItem>(afeedItems);
this.context=context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(context).inflate(R.layout.custum_row_news_item,parent,false);
MyViewHolder holder=new MyViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
YoYo.with(Techniques.FadeIn).playOn(holder.cardView);
final FeedItem current=feedItems.get(position);
holder.Title.setText(current.getTitle());
holder.Description.setText(current.getDescription());
holder.Date.setText(current.getPubDate());
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, NewsDetails.class);
intent.putExtra("Link", current.getLink());
context.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return feedItems.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView Title,Description,Date;
CardView cardView;
public MyViewHolder(View itemView) {
super(itemView);
Title= (TextView) itemView.findViewById(R.id.title_text);
Description=(TextView) itemView.findViewById(R.id.description_text);
Date=(TextView) itemView.findViewById(R.id.date_text);
cardView= (CardView) itemView.findViewById(R.id.cardview);
}
}
}