2011-05-27 12 views
5

Soy nuevo en la programación así que por favor, no me moleste, he estado jugando con un simple lector de RSS, tratando de obtener el enlace a la artice para abrir en una vista web cuando el usuario hace clic el artículo.Aislamiento de un enlace en RSS Feed

He encontrado la cadena que controla y almacena el enlace, pero cuando trato de imprimir el enlace en el brindis aparece el enlace pero con la fecha de publicación del artículo completo ect ... ¿cómo puedo obtener el enlace para imprimirlo? propia y qué comandos necesito para utilizar para pasar el enlace a la vista web una vez que haya aislado, aquí es una parte del código que tengo

RSSActivity

public class RssActivity extends ListActivity { 
    private RssListAdapter adapter; 

     /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     List<JSONObject> jobs = new ArrayList<JSONObject>(); 
     try { 
      jobs = RssReader.getLatestRssFeed(); 
     } catch (Exception e) { 
      Log.e("RSS ERROR", "Error loading RSS Feed Stream >> " + e.getMessage() + " //" + e.toString()); 
     } 

     adapter = new RssListAdapter(this,jobs); 
     setListAdapter(adapter); 
    } 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     // Get the item that was clicked 
     Object o = this.getListAdapter().getItem(position); 
     adapter.getItem(position).toString(); 
     String link = o.toString(); 


     Toast.makeText(this, "You selected: " + link, Toast.LENGTH_LONG) 
       .show(); 


    } 

} 

Article.class

public class Article { 

    private long articleId; 
    private long feedId; 
    private String title; 
    private String description; 
    private String pubDate; 
    private URL url; 
    private String encodedContent; 
    private String link; 


    public void setArticleId(long articleId) { 
     this.articleId = articleId; 
    } 
    /** 
    * @return the feedId 
    */ 
    public long getFeedId() { 
     return feedId; 
    } 
    /** 
    * @param feedId the feedId to set 
    */ 
    public void setFeedId(long feedId) { 
     this.feedId = feedId; 
    } 
    public String getLink() { 
     return link; 
    } 
    /** 
    * @param title the title to set 
    */ 
    public void setLink(String link) { 
     this.link = link; 
    } 
    /** 
    * @return the title 
    */ 
    public String getTitle() { 
     return title; 
    } 
    /** 
    * @param title the title to set 
    */ 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    /** 
    * @return the url 
    */ 
    public URL getUrl() { 
     return url; 
    } 
    /** 
    * @param url the url to set 
    */ 
    public void setUrl(URL url) { 
     this.url = url; 
    } 
    /** 
    * @param description the description to set 
    */ 
    public void setDescription(String description) { 
     this.description = description; 

     //parse description for any image or video links 
     if (description.contains("<img ")){ 
      String img = description.substring(description.indexOf("<img ")); 
      String cleanUp = img.substring(0, img.indexOf(">")+1); 

      int indexOf = img.indexOf("'"); 
      if (indexOf==-1){ 

      } 


      this.description = this.description.replace(cleanUp, ""); 
     } 
    } 
    /** 
    * @return the description 
    */ 
    public String getDescription() { 
     return description; 
    } 
    /** 
    * @param pubDate the pubDate to set 
    */ 
    public void setPubDate(String pubDate) { 
     this.pubDate = pubDate; 
    } 
    /** 
    * @return the pubDate 
    */ 
    public String getPubDate() { 
     return pubDate; 
    } 
    /** 
    * @param encodedContent the encodedContent to set 
    */ 
    public void setEncodedContent(String encodedContent) { 
     this.encodedContent = encodedContent; 
    } 
    /** 
    * @return the encodedContent 
    */ 
    public String getEncodedContent() { 
     return encodedContent; 
    } 
} 

RSS Handler

public class RSSHandler extends DefaultHandler { 

    // Feed and Article objects to use for temporary storage 
    private Article currentArticle = new Article(); 
    private List<Article> articleList = new ArrayList<Article>(); 

    // Number of articles added so far 
    private int articlesAdded = 0; 

    // Number of articles to download 
    private static final int ARTICLES_LIMIT = 15; 

    //Current characters being accumulated 
    StringBuffer chars = new StringBuffer();  

    public void startElement(String uri, String localName, String qName, Attributes atts) { 
     chars = new StringBuffer(); 
    } 

    public void endElement(String uri, String localName, String qName) throws SAXException { 

     if (localName.equalsIgnoreCase("title")) 
     { 
      Log.d("LOGGING RSS XML", "Setting article title: " + chars.toString()); 
      currentArticle.setTitle(chars.toString()); 

     } 
     else if (localName.equalsIgnoreCase("description")) 
     { 
      Log.d("LOGGING RSS XML", "Setting article description: " + chars.toString()); 
      currentArticle.setDescription(chars.toString()); 
     } 
     else if (localName.equalsIgnoreCase("pubDate")) 
     { 
      Log.d("LOGGING RSS XML", "Setting article published date: " + chars.toString()); 
      currentArticle.setPubDate(chars.toString()); 
     } 
     else if (localName.equalsIgnoreCase("encoded")) 
     { 
      Log.d("LOGGING RSS XML", "Setting article content: " + chars.toString()); 
      currentArticle.setEncodedContent(chars.toString()); 
     } 
     else if (localName.equalsIgnoreCase("item")) 
     { 

     } 
     else if (localName.equalsIgnoreCase("link")) 
     { 
      Log.d("LOGGING RSS XML", "Setting article link: " + chars.toString()); 
      currentArticle.setLink(chars.toString()); 
      try { 
       Log.d("LOGGING RSS XML", "Setting article link url: " + chars.toString()); 
       currentArticle.setUrl(new URL(chars.toString())); 
      } catch (MalformedURLException e) { 
       Log.e("RSA Error", e.getMessage()); 
      } 
     } 

     // Check if looking for article, and if article is complete 
     if (localName.equalsIgnoreCase("item")) { 

      articleList.add(currentArticle); 

      currentArticle = new Article(); 

      // Lets check if we've hit our limit on number of articles 
      articlesAdded++; 
      if (articlesAdded >= ARTICLES_LIMIT) 
      { 
       throw new SAXException(); 
      } 
     } 
    } 

    public void characters(char ch[], int start, int length) { 
     chars.append(new String(ch, start, length)); 
    } 

    public List<Article> getLatestArticles(String feedUrl) { 
     URL url = null; 
     try { 

      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      SAXParser sp = spf.newSAXParser(); 
      XMLReader xr = sp.getXMLReader(); 

      url = new URL(feedUrl); 

      xr.setContentHandler(this); 
      xr.parse(new InputSource(url.openStream())); 


     } catch (IOException e) { 
      Log.e("RSS Handler IO", e.getMessage() + " >> " + e.toString()); 
     } catch (SAXException e) { 
      Log.e("RSS Handler SAX", e.toString()); 
     } catch (ParserConfigurationException e) { 
      Log.e("RSS Handler Parser Config", e.toString()); 
     } 

     return articleList; 
    } 

} 

public class RssReader { 

    private final static String BOLD_OPEN = "<B>"; 
    private final static String BOLD_CLOSE = "</B>"; 
    private final static String BREAK = "<BR>"; 
    private final static String ITALIC_OPEN = "<I>"; 
    private final static String ITALIC_CLOSE = "</I>"; 
    private final static String SMALL_OPEN = "<SMALL>"; 
    private final static String SMALL_CLOSE = "</SMALL>"; 
    private final static String WEB_LINK = "<A>"; 
    private final static String WEB_CLOSE = "<A/"; 

    public static List<JSONObject> getLatestRssFeed(){ 
     String feed = "http://newsrss.bbc.co.uk/rss/sportonline_uk_edition/football/eng_prem/rss.xml"; 

     RSSHandler rh = new RSSHandler(); 
     List<Article> articles = rh.getLatestArticles(feed); 
     Log.e("RSS ERROR", "Number of articles " + articles.size()); 
     return fillData(articles); 
    } 


    private static List<JSONObject> fillData(List<Article> articles) { 

     List<JSONObject> items = new ArrayList<JSONObject>(); 
     for (Article article : articles) { 
      JSONObject current = new JSONObject(); 
      try { 
       buildJsonObject(article, current); 
      } catch (JSONException e) { 
       Log.e("RSS ERROR", "Error creating JSON Object from RSS feed"); 
      } 
      items.add(current); 
     } 

     return items; 
    } 

    private static void buildJsonObject(Article article, JSONObject current) throws JSONException { 
     String link = article.getLink(); 
     String title = article.getTitle(); 
     String description = article.getDescription(); 
     String date = article.getPubDate(); 


     StringBuffer sb = new StringBuffer(); 
     sb.append(BOLD_OPEN).append(title).append(BOLD_CLOSE); 
     sb.append(BREAK); 
     sb.append(description); 
     sb.append(BREAK); 
     sb.append(SMALL_OPEN).append(ITALIC_OPEN).append(date).append(ITALIC_CLOSE).append(SMALL_CLOSE); 
     sb.append(BREAK); 
     sb.append(BREAK); 
     sb.append(BOLD_OPEN).append(WEB_LINK).append(link).append(BOLD_CLOSE).append(WEB_CLOSE); 
     current.put("link", link); 

     current.put("text", Html.fromHtml(sb.toString())); 

    } 
} 

RssListAdapter

import java.util.List; 

import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.text.Spanned; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

public class RssListAdapter extends ArrayAdapter<JSONObject> { 

    public RssListAdapter(Activity activity, List<JSONObject> imageAndTexts) { 
     super(activity, 0, imageAndTexts); 
    } 


    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     Activity activity = (Activity) getContext(); 
     LayoutInflater inflater = activity.getLayoutInflater(); 

     // Inflate the views from XML 
     View rowView = inflater.inflate(R.layout.image_text_layout, null); 
     JSONObject jsonImageText = getItem(position); 

     ////////////////////////////////////////////////////////////////////////////////////////////////////// 
     //The next section we update at runtime the text - as provided by the JSON from our REST call 
     //////////////////////////////////////////////////////////////////////////////////////////////////// 
     TextView textView = (TextView) rowView.findViewById(R.id.job_text); 

     try { 
      Spanned text = (Spanned)jsonImageText.get("text"); 
      textView.setText(text); 

     } catch (JSONException e) { 
      textView.setText("JSON Exception"); 
     } 

     return rowView; 

    } 

} 

Respuesta

1

probar este

protected void onListItemClick(ListView l, View v, int position, long id) { 
     super.onListItemClick(l, v, position, id); 
     // Get the item that was clicked 
     JSONObject o = (JSONObject) this.getListAdapter().getItem(position); 
     adapter.getItem(position).toString(); 
     String link = o.getString("NameOfLinkInJsonObject"); 


     Toast.makeText(this, "You selected: " + link, Toast.LENGTH_LONG) 
       .show(); 

     mMyWebView.loadUrl(link); 
    } 

ser consciente de que debe arreglar "NameOfLinkInJsonObject".

En su actividad de agregar un campo al igual que

private WebView mMyWebView; 

En el método onCreate añadir un

mMyWebView = (WebView) findViewById(R.id.webViewId); 

Tendrá que cambiar el R.id.webViewId a la identificación apropiada para tu web ver.

+0

Gracias por su respuesta, en la línea JSONObeject o = this.getlistAdapter Estoy recibiendo un error no se puede convertir de un objeto a JSONObject en el método webview que estoy obteniendo no puede hacer una referencia estática al webview.loadurl (enlace) no estático; – JonniBravo

+0

He editado mi respuesta para ser un poco más exacto. Mi primer corte no fue para copiar. Recuerde, debe cambiar NameOfLinkInJsonObject por el nombre del campo en el objeto JSON que contiene el enlace. –

+0

Gracias Justin Estoy seguro de que podré hacer que esto funcione Lo aprecio – JonniBravo

2

Open URL in default browser Open URL with Android

Si tiene la dirección URL o un objeto URI en un punto, probablemente una de las explicaciones en los enlaces de arriba te llevará en tu camino.

- Editar:

protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    // Get the item that was clicked 
    Object o = this.getListAdapter().getItem(position); 
    adapter.getItem(position).toString(); 
    String link = o.toString(); 
    Toast.makeText(this, "You selected: " + link, Toast.LENGTH_LONG) 
      .show(); 
} 

conjeturando que esto es el código para mostrar el enlace pero si usted no nos proporciona lo que el método getListAdapter(), etc hacer entonces me temo que es duro para ayudar vete.

+0

Tengo mi propia vista web, quiero abrir el enlace dentro de eso, por lo que estos intentos no son adecuados para mis necesidades, ¿Cómo puedo obtener el enlace? y debería usar paquete para pasar la url o put.extras getextras ect ..... – JonniBravo

+0

Muchas disculpas, he proporcionado la clase RSSListAdapter anterior, este es el código completo para el lector de RSS – JonniBravo

+0

Sugiero que intente descubrir para usted mismo qué tipo de Objeto (qué clase) obtiene cuando en la línea 'Objeto o = this.getListAdapter(). getItem (posición);' Aparentemente tiene una implementación toString() que muestra todo el contenido de la fuente RSS. Posiblemente haya un método para 'getUrl()' o cualquier otra cosa. – Wivani

Cuestiones relacionadas