Autore Topic: Parsing html e listView  (Letto 658 volte)

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Parsing html e listView
« il: 15 Aprile 2013, 12:15:55 CEST »
0
Ciao amici del forum, vorrei una mano per piacere a inserire in una listview degli oggetti di cui ho fatto il parsing su internet.

c'e qualche tutoria a riguardo?

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Parsing html e listView
« Risposta #1 il: 15 Aprile 2013, 13:34:16 CEST »
+1
Supponendo che tu abbia fatto già il parsing va bene un qualunque tutorial che implementi un custom ArrayAdapter
ad esempio sul forum: http://www.anddev.it/index.php/topic,432.0.html
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsing html e listView
« Risposta #2 il: 15 Aprile 2013, 13:37:13 CEST »
0
grazie mille ...gli do subito un'occhiata

Post unito: 15 Aprile 2013, 18:25:40 CEST
Cao ilseric ho provato a fare qualcosa ma mi da errore ora te lo posto,non è che ci capisco poi tanto


04-15 18:24:15.288: E/AndroidRuntime(269): FATAL EXCEPTION: main
04-15 18:24:15.288: E/AndroidRuntime(269): java.lang.RuntimeException: Unable to start activity ComponentInfo{pervasive.com.gazzettabenevento/pervasive.com.gazzettabenevento.Politica}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.app.ActivityThread.access$2300(ActivityThread.java:125)
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.os.Looper.loop(Looper.java:123)
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.app.ActivityThread.main(ActivityThread.java:4627)
04-15 18:24:15.288: E/AndroidRuntime(269):    at java.lang.reflect.Method.invokeNative(Native Method)
04-15 18:24:15.288: E/AndroidRuntime(269):    at java.lang.reflect.Method.invoke(Method.java:521)
04-15 18:24:15.288: E/AndroidRuntime(269):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-15 18:24:15.288: E/AndroidRuntime(269):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-15 18:24:15.288: E/AndroidRuntime(269):    at dalvik.system.NativeStart.main(Native Method)
04-15 18:24:15.288: E/AndroidRuntime(269): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.app.ListActivity.onContentChanged(ListActivity.java:245)
04-15 18:24:15.288: E/AndroidRuntime(269):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:201)
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.app.Activity.setContentView(Activity.java:1647)
04-15 18:24:15.288: E/AndroidRuntime(269):    at pervasive.com.gazzettabenevento.Politica.onCreate(Politica.java:34)
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-15 18:24:15.288: E/AndroidRuntime(269):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
04-15 18:24:15.288: E/AndroidRuntime(269):    ... 11 more


Post unito: 15 Aprile 2013, 20:02:13 CEST
Ti spiego cosa sto facendo, voglio realizzare una app in grado di leggere i dati parsati da un quotidiano strutturato in questo modo: la pagina centrale è costituita dalle notizie più importanti, la colonna di sinistra riguarda la politica e quella di destra la cronaca.Io per il momento sono riuscito a fare il parsing della parte riguardante la politica , l'ho provato in java e funziona.
per quanto riguarda l'app ho tre bottoni : politica-cronaca-pagina centrale, e quando clicci ad esempio politica, mi visualizza un layout caratterizzato da listview e poi ho fatto un layout a parte in cui vado a descrivere meglio da cosa deve essere costituito : immagine,titolo, e link href per quando clicco la riga dandomi la possibilità di aprire la notizia interamente.

Ho creato due package il primo  con i seguenti file:

OggettoNotizia.java
Codice (Java): [Seleziona]
public class OggettoNotizia {
        private String foto,titolo,href;
        public OggettoNotizia(){
                this.foto=null;
                this.titolo=null;
                this.href=null;
        }
        public OggettoNotizia(String foto,String titolo,String href){
                this.foto=foto;
                this.titolo=titolo;
                this.href=href;
        }
        public void setFoto(String foto){
                this.foto=foto;
        }
        public void setTitolo(String titolo){
                this.titolo=titolo;
        }
        public void setHref(String href){
                this.href=href;
        }
        public String getFoto(){
                return foto;
        }
        public String getTitolo(){
                return titolo;
        }
        public String getHref(){
                return href;
        }
        }

Parsing.java

Codice (Java): [Seleziona]
mport java.io.IOException;
import java.util.ArrayList;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Parsing {
       
        //Qui vado a crearmi un arrayList contenente tutte gli oggetti che devo mostrare nella mia activityList.
//              @SuppressLint("NewApi")
                public ArrayList<OggettoNotizia> parsingListOggetti(String uri) throws IOException{
                        ArrayList<OggettoNotizia> oggetti=new ArrayList<OggettoNotizia>();
                        Document doc=Jsoup.connect(uri).get();
                        if(doc==null)return oggetti;
               
                        Element tbody = doc.select("table[width=180]").first().child(0);
                     
                      Elements rows = tbody.children();
                     
                      //Rimuovo i primi 4 elementi che non sono utili
                      rows.remove(0);
                      rows.remove(0);
                      rows.remove(0);
                      rows.remove(0);
                     
                      for (Element row : rows) {
                          //Controllo se è vuota o meno
                          Element td = row.child(0);
                          if (td.className().equals("sDataSinistra")){
                             continue;
                          }
                     
                          String photo;
                          while(td!=null){
                                  OggettoNotizia object=new OggettoNotizia();
                                  photo=td.select("a img").attr("src");
                                  if(photo.length()==0)
                                          object.setFoto("http://www.sezzeweb.it/images/immagine-non-disponibile.jpg");
                                  else
                                          object.setFoto(photo);
                                 
                                  object.setTitolo(td.select("a span").first().text());
                                  object.setHref(td.select("a").first().attr("href"));
                                  oggetti.add(object);
                                  td=td.nextElementSibling();
                          }

                          }
                        return oggetti;
                }
}


NotiziaAdapter.java
Codice (Java): [Seleziona]
import java.util.List;

import Dom.OggettoNotizia;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class NotiziaAdapter extends ArrayAdapter<OggettoNotizia> {

        private int resource;
        private LayoutInflater inflater;

        public NotiziaAdapter(Context context, int resourceId, List<OggettoNotizia> objects) {
                super(context, resourceId, objects);
                resource = resourceId;
                inflater = LayoutInflater.from(context);
        }

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

                // Recuperiamo l'oggetti che dobbiamo inserire a questa posizione
                OggettoNotizia news = getItem(position);

                ViewHolder holder;

                if (v == null) {
                        v = inflater.inflate(resource, parent, false);
                        holder = new ViewHolder();
                        holder.titoloTextView = (TextView) v.findViewById(R.id.title);
                        holder.imageView = (ImageView) v.findViewById(R.id.list_image);
                        v.setTag(holder);
                } else {
                        holder = (ViewHolder) v.getTag();
                }

             //   holder.imageView.setImageResource(news.getFoto());qui mi da errore
//perchè devo trovare un metodo di tipo String per il momento l'ho lasciato stare
//poi l'aggiusto
                holder.titoloTextView.setText(news.getTitolo());
               
                return v;
        }

        private static class ViewHolder {
                TextView titoloTextView;
                ImageView imageView;
        }
}

Politica.java
Codice (Java): [Seleziona]
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;



import Dom.OggettoNotizia;
import Dom.Parsing;
import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class Politica extends ListActivity{
       
        private ArrayAdapter<OggettoNotizia> adapter;
        private String uri;
       
               
       
         @Override
         public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
               
                ArrayList<OggettoNotizia> listaNotizie=new ArrayList<OggettoNotizia>();
               
              //Questa è la lista che rappresenta la sorgente dei dati della listview
                //ogni elemento è una mappa(chiave->valore)
                ArrayList<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>();
               
                for(int i=0;i<listaNotizie.size();i++){
                OggettoNotizia on=listaNotizie.get(i);// per ogni persona all'inteno della ditta

                HashMap<String,Object> notizieMap=new HashMap<String, Object>();//creiamo una mappa di valori
              //notizieMap.put("image", on.getPhotoRes()); // per la chiave image, inseriamo la risorsa dell immagine
                notizieMap.put("titolo", on.getTitolo()); // per la chiave name,l'informazine sul nome
                data.add(notizieMap);  //aggiungiamo la mappa di valori alla sorgente dati
                }
                String[] from={"image","name","surname"}; //dai valori contenuti in queste chiavi
                int[] to={R.id.list_image,R.id.title};//agli id delle view
               
              //costruzione dell adapter
                SimpleAdapter adapter=new SimpleAdapter(
                                getApplicationContext(),
                                data,//sorgente dati
                                R.layout.list_row, //layout contenente gli id di "to"
                                from,
                                to);
               
                //utilizzo dell'adapter
                ((ListView)findViewById(R.id.list)).setAdapter(adapter);
        }
}
               

               
         

       

Però quando vado a cliccare il bottone politica e quindi richiama l'attività Politica.java va in crasch (precedentemente ho scritto l'errore che mi da nel logcat)

Perpiacere qualcuno mi aiuti ci sono quasi vicino ;)
« Ultima modifica: 15 Aprile 2013, 20:02:13 CEST da moskino11, Reason: Merged DoublePost »

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Parsing html e listView
« Risposta #3 il: 15 Aprile 2013, 23:16:08 CEST »
0
E' quasi tutto giusto almeno da una letta veloce...
L'errore che ti dà è causato dal fatto che estendi ListActivity nella classe Politica. Quindi hai due possibilità:

Estendi da activity e non da listactivity (e dovrebbe funzionare, ma prova tu)

Se invece estendi da listactivity nel file xml del layout associato l'id della lista che adesso è list deve essere android.R.id.list, deve cioè essere quello di "default" di android
Quindi, nell'activity, invece che fare il findViewById() fai getListView()



Io trovo più semplice il primo :D
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsing html e listView
« Risposta #4 il: 16 Aprile 2013, 01:37:47 CEST »
0
Ho fatto come hai detto tu e adesso non mi da più errori  :-) grazie , però quando clicco il bottone politica va all'attività però non mi visualizza niente, c'e qualche errore di sicuro nel parsing vero?

Offline rs94

  • Utente normale
  • ***
  • Post: 227
  • Respect: +21
    • Mostra profilo
  • Dispositivo Android:
    Sony Ericsson Xperia Arc S
  • Sistema operativo:
    Windows 8
Re:Parsing html e listView
« Risposta #5 il: 16 Aprile 2013, 14:11:18 CEST »
+1
Sinceramente non so... tu hai detto che il parsing funziona... però le cose che mi sono sembrate strane (sbagliate mi sembra eccessivo, magari mi sbaglio io):

1- nell'activity Politica usi un SimpleAdapter, e invece hai postato anche una classe che estende arrayadapter, che non viene però mai usata.
2- (qui potrei sbagliarmi) da quanto ho letto nel tuo codice non effettui mai il parsing :D quindi è normale che non ti visualizzi niente :)


PS: stando anche ai commenti nell'activity mi sembra (correggimi se sbaglio) che tu abbia copiato e incollato il codice da internet. Forse prima di visualizzare una lista da elementi di cui hai fatto il parsing è meglio che provi il funzionamento della lista con oggetti locali, che definisci tu. Intendo cioè che prima visualizzi la lista e controlli che tutto funziona con dati a caso inseriti da te, e dopo provi con il parsing.
L'unica certezza è il dubbio.
Dubitare di se stessi è il primo segno di intelligenza.

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsing html e listView
« Risposta #6 il: 16 Aprile 2013, 17:04:01 CEST »
0
Hai perfettamente ragione , ho fatto un po di copia incolla ora cerco di fare come hai detto tu perlomeno capisco meglio gli errori grazie!

Offline moskino11

  • Utente normale
  • ***
  • Post: 179
  • Respect: 0
    • Mostra profilo
Re:Parsing html e listView
« Risposta #7 il: 27 Aprile 2013, 15:34:18 CEST »
0
Ciao ilseric ho trovato un'ottimo tutoria e ho capito come inserire delle stringhe e delle immagini nelle listView utilizzando dei dati statici,e fin qui tutto ok, ora vorrei capire pian piano come inserire i miei dati parsati però siccome non l'ho mai fatto mi farebbe davvero piacere se qualcuno che legge il mio post o anche tu, mi potresti guidare passo passo facendomi capire come fare .è più di un mese che provo a fare questa cosa da solo e non ci riesco  -.- per il momento ho questo codice:

Codice (Java): [Seleziona]
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

        String[] countries = new String[] {
                        "India",
                "Pakistan",
                "Sri Lanka",
                "China",
                "Bangladesh",
                "Nepal",
                "Afghanistan",
                "North Korea",
                "South Korea",
                "Japan"
        };
       
        int[] flags = new int[] {
                        R.drawable.india,
                         R.drawable.pakistan,
                        R.drawable.srilanka,
                        R.drawable.china,
                        R.drawable.bangladesh,
                        R.drawable.nepal,
                        R.drawable.afghanistan,
                        R.drawable.nkorea,
                        R.drawable.skorea,
                        R.drawable.japan
        };
       
        String[] currency = new String[] {
                        "Indian Rupee",
                "Pakistani Rupee",
                "Sri Lankan Rupee",
                "Renminbi",
                "Bangladeshi Taka",
                "Nepalese Rupee",
                "Afghani",
                "North Korean Won",
                "South Korean Won",
                "Japanese Yen" 
        };
       
       
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
   
        List<HashMap<String, String>> lista = new ArrayList<HashMap<String, String>>();
       
        for(int i=0; i<10; i++) {
                HashMap<String, String> hm = new HashMap<String, String>();
                hm.put("txt", "Country: " + countries[i]);
                hm.put("cur", "Currency: " + currency[i]);
                hm.put("flag", Integer.toString(flags[i]));
                lista.add(hm);
        }
       
        String[] from = { "flag", "txt", "cur"};
        int[] to = { R.id.flag, R.id.txt, R.id.cur};
       
        SimpleAdapter adapter = new SimpleAdapter(getBaseContext(), lista, R.layout.listview_layout, from, to);
        ListView listView = (ListView)findViewById(R.id.listview);
        listView.setAdapter(adapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

e questo è il codice dei layout listView_layout.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="horizontal"
>
    <ImageView
       android:id="@+id/flag"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:paddingTop="10dp"
       android:paddingRight="10dp"
       android:paddingBottom="10dp"
   />
 
    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical"
   >
        <TextView
           android:id="@+id/txt"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textSize="15dp"
       />
 
        <TextView
           android:id="@+id/cur"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:textSize="10dp"
       />
    </LinearLayout>
</LinearLayout>


activity_main.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >
 
     <TextView
       android:id="@+id/textview"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
   />
     
    <ListView
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:id = "@+id/listview"
   />
 
</LinearLayout>


Io invece vorrei una sola stringa che comparisse per ogni riga della lista e un'immagine e fin qui ci sono.

Ora però non so come inserire i miei dati prelevati da internet..ti prego aiutami ...altrimenti non so proprio dove mettere mani