2017-03-08 83 views
0

我正在創建一個包含RSS提要的Android應用程序。目前,我已經編寫了應用程序以從一個xml提要中獲取數據,並顯示我的想法。但是,我不確定如何將多個XML feed添加到我的程序中。我希望該應用顯示來自多個Feed /鏈接的數據。我目前直接從網址提取我的單一Feed。如何將多個Feed添加到RSS feed android應用程序中?

我是Java編程和Android Studio的初學者,所以這可能是我無法弄清楚的原因!有人建議一個txt文件來保存所有的提要鏈接,但我不知道我會如何編碼。

如果您還需要下面的文件,請告訴我。我想我已經包含了相關的文件。

爲了成爲nooby道歉,任何幫助將大規模讚賞!

ReadRSS.java:

package com.example.liutaurasmazonas.cslogintrying; 

import android.app.ProgressDialog; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.provider.DocumentsContract; 
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.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import static android.R.attr.data; 

/** 
* Created by Joe on 04/03/2017. 
*/ 
public class ReadRss extends AsyncTask<Void,Void,Void>{ 
    ArrayList<FeedItem>feedItems; 
    RecyclerView recyclerView; 
    Context context; 
    String address="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(Document data) { 
     if (data != null){ 
      feedItems=new ArrayList<>(); 
      Element root=data.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("itunes:summary")){ 
          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 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; 
     } 
    } 
} 

MyAdapter.java

package com.example.liutaurasmazonas.cslogintrying; 

import android.content.Context; 
import android.content.Intent; 
import android.support.v7.widget.CardView; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import com.daimajia.androidanimations.library.Techniques; 
import com.daimajia.androidanimations.library.YoYo; 

import org.w3c.dom.Text; 

import java.util.ArrayList; 

/** 
* Created by Joe on 05/03/2017. 
*/ 

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ 
    ArrayList<FeedItem>feedItems; 
    Context context; 
    public MyAdapter(Context context,ArrayList<FeedItem>feedItems){ 
     this.feedItems=feedItems; 
     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); 
     } 
    } 
} 
+0

你可以發佈其他鏈接,你想提取飼料? –

回答

1

也可以在另一RecyclerView簡單地添加到您的XML佈局,在那裏你想顯示多張進紙,然後使用另一個Asynctask和Adapter從新的RecyclerView上加載來自不同URL的提要。

這樣,

public class ReadRssFromUrl extends AsyncTask<Void,Void,Void>{ 
ArrayList<FeedItem>feedItems; 
RecyclerView recyclerView1; 
Context context; 
String address="aDifferentUrl.xml"; 
ProgressDialog progressDialog; 
URL url; 
public ReadRss(Context context, RecyclerView recyclerView1){ 
    this.recyclerView1=recyclerView1; 
    this.context=context; 
    progressDialog=new ProgressDialog(context); 
    progressDialog.setMessage("Loading..."); 
} 

所以,你傳遞給該構造方法的RecyclerView應該是新的。

希望這會有所幫助。

+0

或者您可以保持Asynctask類相同,只需通過構造函數發送新的URL和新的RecyclerView,並設置適配器,就像您當前正在做的那樣。 – hsm59