2013-10-20 294 views
0

我是新來的android開發應用程序,我想解析rss url成listview。該代碼正在工作,但我們希望從rss提要中提取圖像並將其顯示到列表視圖中。從rss feed提取圖片

RssItem.java

public class RssItem { 

// item title 
private String title; 
// item link 
private String link; 

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; 
} 

@Override 
public String toString() { 
    return title; 
} 

} 

ListListener.java

public class ListListener implements OnItemClickListener { 

// List item's reference 
List<RssItem> listItems; 
// Calling activity reference 
Activity activity; 

public ListListener(List<RssItem> aListItems, Activity anActivity) { 
    listItems = aListItems; 
    activity = anActivity; 
} 

/** 
* Start a browser with url from the rss item. 
*/ 
public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 
    Intent i = new Intent(Intent.ACTION_VIEW); 
    i.setData(Uri.parse(listItems.get(pos).getLink())); 

    activity.startActivity(i); 

} 

} 

RssParseHandler.java

public class RssParseHandler extends DefaultHandler { 

private List<RssItem> rssItems; 

// Used to reference item while parsing 
private RssItem currentItem; 

// Parsing title indicator 
private boolean parsingTitle; 
// Parsing link indicator 
private boolean parsingLink; 

public RssParseHandler() { 
    rssItems = new ArrayList<RssItem>(); 
} 

public List<RssItem> getItems() { 
    return rssItems; 
} 

@Override 
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException 
{ 
    if ("item".equals(qName)) { 
     currentItem = new RssItem(); 
    } else if ("title".equals(qName)) { 
     parsingTitle = true; 
    } else if ("link".equals(qName)) { 
     parsingLink = true; 
    } 
} 

@Override 
public void endElement(String uri, String localName, String qName) throws SAXException { 
    if ("item".equals(qName)) { 
     rssItems.add(currentItem); 
     currentItem = null; 
    } else if ("title".equals(qName)) { 
     parsingTitle = false; 
    } else if ("link".equals(qName)) { 
     parsingLink = false; 
    } 
} 

@Override 
public void characters(char[] ch, int start, int length) throws SAXException { 
    if (parsingTitle) { 
     if (currentItem != null) 
      currentItem.setTitle(new String(ch, start, length)); 
    } else if (parsingLink) { 
     if (currentItem != null) { 
      currentItem.setLink(new String(ch, start, length)); 
      parsingLink = false; 
     } 
    } 
} 

} 

RssReader.java

public class RssReader { 

private String rssUrl; 

/** 
* Constructor 
* 
* @param rssUrl 
*/ 
public RssReader(String rssUrl) { 
    this.rssUrl = rssUrl; 
} 

/** 
* Get RSS items. 
* 
* @return 
*/ 
public List<RssItem> getItems() throws Exception { 
    // SAX parse RSS data 
    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    SAXParser saxParser = factory.newSAXParser(); 

    RssParseHandler handler = new RssParseHandler(); 

    saxParser.parse(rssUrl, handler); 

    return handler.getItems(); 

} 

} 

ITCutiesReaderAppActivity.java

public class ITCutiesReaderAppActivity extends Activity { 

// A reference to the local object 
private ITCutiesReaderAppActivity local; 

/** 
* This method creates main application view 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // Set view 
    setContentView(R.layout.main); 

    // Set reference to this activity 
    local = this; 

    GetRSSDataTask task = new GetRSSDataTask(); 

    // Start download RSS task 
    task.execute("http://www.itcuties.com/feed/#sthash.YI6YrEet.dpuf"); 

    // Debug the thread name 
    Log.d("ITCRssReader", Thread.currentThread().getName()); 
} 

public class GetRSSDataTask extends AsyncTask<String, Void, List<RssItem> > { 
    @Override 
    protected List<RssItem> doInBackground(String... urls) { 

     // Debug the task thread name 
     Log.d("ITCRssReader", Thread.currentThread().getName()); 

     try { 
      // Create RSS reader 
      RssReader rssReader = new RssReader(urls[0]); 

      // Parse RSS, get items 
      return rssReader.getItems(); 

     } catch (Exception e) { 
      Log.e("ITCRssReader", e.getMessage()); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(List<RssItem> result) { 

     // Get a ListView from main view 
     ListView itcItems = (ListView) findViewById(R.id.listMainView1); 

     // Create a list adapter 
     ArrayAdapter<RssItem> adapter = new ArrayAdapter<RssItem> (local,android.R.layout.simple_list_item_1,  result); 
     // Set list adapter for the ListView 
     itcItems.setAdapter(adapter); 

     // Set list view item click listener 
     itcItems.setOnItemClickListener(new ListListener(result, local)); 
    } 
} 
} 
+1

所以...你有什麼實際問題?您希望我們閱讀這段代碼的重載並準確告訴您要添加或更改哪些內容?你至少可以把它放在幾行實際上相關的代碼中嗎? –

+0

這段代碼只會從rss中提取標題,但我想將這些圖像也提取到列表視圖中。 – user2870902

回答

1

你重新發明輪子。您可以通過使用android-rssdroidQuery簡化一切(原貼here):

final RSSHandler handler = new RSSHandler(new RSSConfig()); 
$.ajax(new AjaxOptions().url(options.url()) 
         .type("GET") 
         .dataType("XML") 
         .context(this) 
         .SAXContentHandler(handler) 
         .success(new Function() { 
          @Override 
          public void invoke($ droidQuery, Object... params) { 
           RSSFeed feed = handler.feed(); 
           List<RSSItem> = feed.getItems(); 
           //use this list to update your list adapter, then call the method "getThumbnails()" to get the images associated with the feed item. 
          } 
         })); 
+0

我可以在哪裏添加此代碼? – user2870902

+0

@ user2870902此代碼替換您的代碼。將它放在你的Activity中,然後創建一個新的'RSSAdapter'作爲你的'ListView'適配器,並簡單地把接收到的數據放入這個適配器並調用'adapter.notifyDataSetChanged()'。 – Phil

+0

我很感謝你的幫助,但是你能給我一個例子嗎,因爲我是android – user2870902

0

在網上閱讀了幾個小時後,我得到這個,原來代碼沒有解析圖像,但是,DOM閱讀文檔後元素(來自Android Studio附帶的文檔),我能夠創建下面的代碼片段,它實際上起作用。我在控制檯中測試了它。

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 

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

/** 
* Created by user on 7/1/2016. 
*/ 
public class FeedParser { 
    // names of the XML tags 
    static final String PUB_DATE = "pubDate"; 
    static final String LINK = "link"; 
    static final String TITLE = "title"; 
    static final String ITEM = "item"; 
    static final String IMAGE = "media:thumbnail"; 
    static final String AUTHOR = "author"; 

    final URL feedUrl; 

    public FeedParser(String feedUrl){ 
     try { 
      this.feedUrl = new URL(feedUrl); 
     } catch (MalformedURLException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public InputStream getInputStream() { 
     try { 
      return feedUrl.openConnection().getInputStream(); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    public void parse() { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 

     try { 
      DocumentBuilder builder = factory.newDocumentBuilder(); 
      Document dom = builder.parse(this.getInputStream()); 
      Element root = dom.getDocumentElement(); 
      NodeList items = root.getElementsByTagName(ITEM); 
      for (int i=0;i<items.getLength();i++){ 

       Node item = items.item(i); 
       NodeList properties = item.getChildNodes(); 
       for (int j=0;j<properties.getLength();j++){ 
        Node property = properties.item(j); 
        String name = property.getNodeName(); 
        if (name.equalsIgnoreCase(TITLE)){ 
         System.out.println(property.getFirstChild().getNodeValue()); 
        } else if (name.equalsIgnoreCase(LINK)){ 
         System.out.println(property.getFirstChild().getNodeValue()); 
        } else if (name.equalsIgnoreCase(AUTHOR)){ 
         StringBuilder text = new StringBuilder(); 
         NodeList chars = property.getChildNodes(); 
         for (int k=0;k<chars.getLength();k++){ 
          text.append(chars.item(k).getNodeValue()); 
         } 
         System.out.println(text.toString()); 
        } else if (name.equalsIgnoreCase(PUB_DATE)){ 
         System.out.println(property.getFirstChild().getNodeValue()); 
        } 
        else if (name.equalsIgnoreCase(IMAGE)){ 
         System.out.println(property.getAttributes().getNamedItem("url").getNodeValue()); 
        } 
       } 

      } 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 

    } 

    public static void main(String[] aeg){ 
    new FeedParser("http://www.pcworld.com/index.rss").parse(); 
    } 
} 

雖然我的答案是晚我希望它可以幫助別人