A tecnologia RSS tornou-se uma forma padrão que os sites encontraram para compartilhar suas informações. Com ele, os usuários podem visualizar seu conteúdo de forma padronizada, uma vez que utiliza o formato XML. Sendo assim, vou mostrar nesse post como ler um RSS com Android. Mas o código utilizado aqui pode ser utilizado para qualquer XML.
Vou começar criando a classe que vai representar uma notícia do RSS. Ela tem basicamente um título, um resumo da notícia e um link para notícia completa.
class Noticia { String titulo; String descricao; String link; public Noticia(String t, String d, String l) { titulo = t; descricao = d; link = l; } @Override public String toString() { return titulo; } }
Simplifiquei ao máximo a classe aqui, não coloquei nem os GETs nem os SETs. Implementei apenas o método toString() pois o mesmo é utilizado pelo Adapter (que veremos em seguida) para exibir a notícia.
Agora vamos ver o código da Activity.
public class LeitorRSSActivity extends ListActivity { List<Noticia> news; ArrayAdapter<Noticia> adapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); news = new ArrayList<Noticia>(); adapter = new ArrayAdapter<Noticia>( this, android.R.layout.simple_list_item_1, news); setListAdapter(adapter); // Criando AsyncTask que buscará o RSS da globo new RssAsyncTask().execute( "http://g1.globo.com/dynamo/rss2.xml"); } // Método que lê o XML do RSS private List<Noticia> readXML(InputStream is){ List<Noticia> noticias = new ArrayList<Noticia>(); try { // Criando os objetos que representam o XML DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document xmlDocument = builder.parse(is); // Cada notícia é representada pela tag <item> // Aqui obtemos a lista de nós com essa tag NodeList posts = xmlDocument.getElementsByTagName("item"); // Vamos iterar sobre a lista de itens String titulo = null, descricao = null, link = null; for (int i = 0; i < posts.getLength(); i++) { Node post = posts.item(i); // Cada nó ITEM tem os filhos: // TITLE, DESCRIPTION e LINK NodeList postInfo = post.getChildNodes(); for (int j = 0; j < postInfo.getLength(); j++){ Node info = postInfo.item(j); if ("title".equals(info.getNodeName())){ titulo = info.getTextContent(); } else if ("link".equals( info.getNodeName())){ link = info.getTextContent(); } else if ("description".equals( info.getNodeName())){ descricao = info.getTextContent(); } } // Com as informações das tags, criamos o // objeto notícia e adicionamos na lista noticias.add( new Noticia(titulo, descricao, link)); } } catch (Throwable e) { e.printStackTrace(); } return noticias; } // A AsyncTask realiza a comunicação em background class RssAsyncTask extends AsyncTask<String, Void, List<Noticia>>{ ProgressDialog dialog; @Override protected void onPreExecute() { super.onPreExecute(); // Antes de baixaro XML, mostra o dialog dialog = ProgressDialog.show( LeitorRSSActivity.this, "Aguarde", "Baixando RSS"); } @Override protected List<Noticia> doInBackground( String... params) { List<Noticia> lista = null; HttpURLConnection conexao = null; InputStream is = null; try { URL url = new URL(params[0]); conexao = (HttpURLConnection) url.openConnection(); conexao.connect(); is = conexao.getInputStream(); lista = readXML(is); } catch (Throwable t){ t.printStackTrace(); } finally { try { if (is != null) is.close(); if (conexao != null) conexao.disconnect(); } catch (Throwable t){ } } return lista; } @Override protected void onPostExecute(List<Noticia> result){ super.onPostExecute(result); dialog.dismiss(); news.addAll(result); adapter.notifyDataSetChanged(); } } }
Quem tiver dúvida sobre AsyncTask, dá uma olhada aqui, ou deixem seus comentários.
4br4ç05,
nglauber
10 comentários:
Muito bom este tutorial glauber. parabéns!
Olá povo,
O método getTextContent() usado nas linhas 53, 57 e 61 não está disponível na versão 2.1 do Android, e pode ser substituído por getFirstChild().getNodeValue().
4br4ç05,
nglauber
Olá Nelson, Boa Tarde, muito obrigado pela matéria, gostaria de saber como seriam feitos os views para exibir na tela do Android a lista de RSS...
[]s,
Oi Eduardo,
O código acima já lista o RSS na tela...
4br4ç05,
nglauber
muito bom, funcionou direitinho.
agora como eu faço para ele pegar uma imagem também do link? e mostrar? tenho q usar adapter? ou tem como ele mostrar sem adapter?
vlw, abraços
Oi Anônimo,
Você terá que alterar o parser para extrair essa informação. Daí alterar o adapter para que essa imagem apareça na lista. Aconselho usar esse componente:
https://github.com/leocadiotine/WebCachedImageView
4br4ç05,
nglauber
Olá.
Muito bom esse post, com ele consigo mostrar 1 item do XML (pelo toString) e jogando no layout (android.R.layout.simple_list_item_1).
Minha dúvida é como mostrar todos os dados dispostos em um layout que eu irei criar.
Pode me ajudar?
Oi Matheus,
É só substituir o ArrayAdapter por um adapter customizado:
http://nglauber.blogspot.com.br/2011/03/adapter-eficiente-no-android.html
4br4ç05,
nglauber
Excelente post. Blog nota 10.
Como faço para abrir essas notícias em uma WebView?
Oi Darkshneider,
Basicamente você teria que implementar o método onListItemClick e obter o objeto Noticia.
Noticia noticia = (Noticia)getListAdapter().getItem(position);
Depois é só carregar a Url na WebView.
webView.loadUrl(noticia.link);
Dá uma olhada aqui:
http://developer.android.com/reference/android/webkit/WebView.html
4br4ç05,
nglauber
Postar um comentário