Autore Topic: ListView con dati provenienti da db  (Letto 1270 volte)

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
ListView con dati provenienti da db
« il: 31 Agosto 2010, 15:42:44 CEST »
0
Salve a tutti,
sono un neofita in questo campo e, dopo aver letto il libro di carli, sto riscontrando alcuni problemi nella realizzazione di una listVIew;

In particolare sto cercando di implementare una listView che prelevi delle info dal db e, in base alla categoria a cui appartiene, visualizzare un'icona e la propria descrizione.

Ho provato a seguire questo tutorial [medio] ListView con layout personalizzato tramite un SimpleAdapter - Android Developers Italia ma io e le HashMap non andiamo troppo daccordo  :'( :'(

qualche idea?

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:ListView con dati provenienti da db
« Risposta #1 il: 31 Agosto 2010, 16:09:54 CEST »
0
se hai i dati su un database, allora non ti serve usare un SimpleAdapter, ma un SimpleCursorAdapter (SimpleCursorAdapter | Android Developers).

è abbastanza semplice da utilizzare.

se caso hai dei problemi, posta un po del tuo codice cosi vediamo di risolvere ;)


Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ListView con dati provenienti da db
« Risposta #2 il: 31 Agosto 2010, 16:24:51 CEST »
0
avevo già percorso quella strada seguendo questo tutorial [facile] Visualizzare gli oggetti di una ListView in gruppi omogenei con titolo - Android Developers Italia ma ho visto che anche li c'erano le hash map.

comunque ho provato con il seguente codice
Codice (Java): [Seleziona]
 // Mapping tra i campi della tabella ed elementi del layout di riga
        private String[] FROMS = new String[] { EventiMetaData.TITOLO };
        private int[] TOS = new int[] { R.id.evento };
        /*
         * Riferimento al DB
         */

        private SQLiteDatabase db;
        /*
         * Cursore dei risultati
         */

        private Cursor cursor;
        /*
         * Riferimento all'Adpater
         */

        private CursorAdapter adapter;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.s2);
                // Otteniamo il riferimento al DB in lettura e scrittura
                EventiDB db_eventi = new EventiDB(this);
                db = db_eventi.getWritableDatabase();
                // Eseguiamo la query per estrarre tutte le informazioni dalla tabella
                cursor = db.query(EventiMetaData.TABLE_NAME, new String[] {EventiMetaData.TITOLO}, null, null, null, null, null);
               
                // Creiamo un Adapter con il cursore
                adapter = new SimpleCursorAdapter(this, R.layout.row_layout, cursor, FROMS, TOS);
                // Lo assegnamo alla ListView
                getListView().setAdapter(adapter);
                // Registriamo il Menu Contesuale
                registerForContextMenu(getListView());
               
        }

questa è la s2.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:orientation="vertical"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent">
        <ListView
               android:id="@+id/personListView"
               android:layout_width="fill_parent"
               android:layout_height="fill_parent">
        </ListView>
</LinearLayout>

e questa la row_layout.xml
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
       xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="60dip"
       android:padding="5dip">


        <ImageView
               android:id="@+id/eventImage"
               android:layout_width="50dip"
               android:layout_height="50dip"
       >
        </ImageView>


        <TextView
               android:text="Evento"
               android:layout_marginLeft="5dip"
               android:textAppearance="?android:attr/textAppearanceLarge"
               android:id="@+id/evento"
               android:layout_toRightOf="@id/eventImage"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"></TextView>
        <TextView
               android:text="Distanza"
               android:textAppearance="?android:attr/textAppearanceMedium"
               android:textColor="#6b71f1"
               android:id="@+id/distanza"
               android:layout_alignLeft="@+id/evento"
               android:layout_alignParentBottom="true"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content">
        </TextView>
</RelativeLayout>


« Ultima modifica: 31 Agosto 2010, 16:34:04 CEST da niko_2307 »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:ListView con dati provenienti da db
« Risposta #3 il: 31 Agosto 2010, 16:55:00 CEST »
0
avevo già percorso quella strada seguendo questo tutorial [facile] Visualizzare gli oggetti di una ListView in gruppi omogenei con titolo - Android Developers Italia ma ho visto che anche li c'erano le hash map.


??

se hai i dati su un database, allora non ti serve usare un SimpleAdapter, ma un SimpleCursorAdapter (SimpleCursorAdapter | Android Developers).

è abbastanza semplice da utilizzare.

se caso hai dei problemi, posta un po del tuo codice cosi vediamo di risolvere ;)



alla fine hai usato un SimpleCursorAdapter ;)



Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ListView con dati provenienti da db
« Risposta #4 il: 31 Agosto 2010, 17:06:32 CEST »
0
alla fine hai usato un SimpleCursorAdapter ;)

diciamo che ho tentato...non so perché ma l'applicazione mi da errore all'avvio dell'activity.

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ListView con dati provenienti da db
« Risposta #5 il: 31 Agosto 2010, 17:09:49 CEST »
0
mi sorge il dubbio...possibile che non funzioni perché il db inizialmente non è popolato?  :-[

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:ListView con dati provenienti da db
« Risposta #6 il: 31 Agosto 2010, 17:18:58 CEST »
0
beh per far vedere qualcosa, il db dovresti popolarlo....

comunque

prova a fare questa cosa:

in questa query
Codice (Java): [Seleziona]
cursor = db.query(EventiMetaData.TABLE_NAME, new String[] {EventiMetaData.TITOLO}, null, null, null, null, null);
aggiungi anche il campo "_id"
Codice (Java): [Seleziona]
cursor = db.query(EventiMetaData.TABLE_NAME, new String[] {"_id",EventiMetaData.TITOLO}, null, null, null, null, null);

poi dovresti postare il logcat quando hai un errore.... ti fa vedere la linea, e l'eccezione generata ;)

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ListView con dati provenienti da db
« Risposta #7 il: 31 Agosto 2010, 17:41:39 CEST »
0
beh per far vedere qualcosa, il db dovresti popolarlo....

comunque

prova a fare questa cosa: ...

avevo provato anche questo ma evidentemente non sta li il problema  o_O

da precisare che la mia activity estende la ListActivity e di conseguenza posso utilizzare questo metodo per settare l'adapter
Codice (Java): [Seleziona]
getListView().setAdapter(adapter);

però ho notato che se invece estendo la classe Activity senza settare l'adapter l'applicazione parte con successo

il log comunque è questo
Codice (Text): [Seleziona]
08-31 17:26:36.812: INFO/ActivityManager(53): Starting activity: Intent { cmp=it.niko.android/.S2 }
08-31 17:26:36.932: WARN/dalvikvm(5887): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
08-31 17:26:36.932: ERROR/AndroidRuntime(5887): Uncaught handler: thread main exiting due to uncaught exception
08-31 17:26:36.942: ERROR/AndroidRuntime(5887): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.niko.android/it.niko.android.S2}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.os.Looper.loop(Looper.java:123)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.app.ActivityThread.main(ActivityThread.java:4363)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at java.lang.reflect.Method.invokeNative(Native Method)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at java.lang.reflect.Method.invoke(Method.java:521)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at dalvik.system.NativeStart.main(Native Method)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.app.ListActivity.onContentChanged(ListActivity.java:236)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:201)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.app.Activity.setContentView(Activity.java:1622)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at it.niko.android.S2.onCreate(S2.java:56)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
08-31 17:26:36.942: ERROR/AndroidRuntime(5887):     ... 11 more
08-31 17:26:36.972: INFO/Process(53): Sending signal. PID: 5887 SIG: 3
08-31 17:26:36.972: INFO/dalvikvm(5887): threadid=7: reacting to signal 3
08-31 17:26:36.992: INFO/dalvikvm(5887): Wrote stack trace to '/data/anr/traces.txt'
08-31 17:26:46.843: WARN/ActivityManager(53): Launch timeout has expired, giving up wake lock!
08-31 17:26:46.862: WARN/ActivityManager(53): Activity idle timeout for HistoryRecord{43d99830 it.niko.android/.S2}

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ListView con dati provenienti da db
« Risposta #8 il: 31 Agosto 2010, 18:02:26 CEST »
0
ok sono un idiota...non avevo messo l'id della ListView con il valore
Codice (XML): [Seleziona]
@id/android:list
grazie comunque per le dritte...adesso cerco di sistemare anche la visualizzazione delle icone  ;-)

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:ListView con dati provenienti da db
« Risposta #9 il: 31 Agosto 2010, 18:05:01 CEST »
+1
Estendendo ListActivity

devi in questo modo il layout:

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

questo perchè quando fai getListView()  la ListActivity va a cercare la listview con quell id


Se invece estendi Activity puoi dichiararlo come hai fatto:

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

in questo modo invece devi "linkare la view"  ListView lv=(ListView)findViewById(R.id.myListView), in quanto la classe Activity non fornisce il metodo getListView()

« Ultima modifica: 31 Agosto 2010, 18:06:55 CEST da Qlimax »

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ListView con dati provenienti da db
« Risposta #10 il: 31 Agosto 2010, 18:10:42 CEST »
0
grazie mille   ;-)

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ListView con dati provenienti da db
« Risposta #11 il: 01 Settembre 2010, 12:00:13 CEST »
0
ancora un ultimo dubbio...sto cercando di far si che ad ogni elemento selezionato corrisponda una activity con la descrizione dell'evento.

pensavo di utilizzare questo metodo ma non capisco se può funzionare con il mio progetto dato che sto utilizzando un SimpleCursorAdapter al posto di un AdapterView
Codice (Java): [Seleziona]
 
ListView ls=(ListView)findViewById(R.id.list);
ls.setOnItemClickListener(new OnItemClickListener()  {
        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                        // fai qualcosa
        }
 });


Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:ListView con dati provenienti da db
« Risposta #12 il: 01 Settembre 2010, 13:28:08 CEST »
0
AdapterView è la ListView su cui hai cliccato, ListView estende AdapterView.
quindi, sì, funziona ;)

per passare i dati alle nuove activity, dai un occhiata qui:  [facile] Passaggio di dati tra un'activity ed un'altra - Android Developers Italia



Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ListView con dati provenienti da db
« Risposta #13 il: 01 Settembre 2010, 14:34:55 CEST »
0
io stavo provando a far stampare il contenuto dell'elemento selezionato in un AlertDialog ma il risultato restituito è un tipo object
Codice (Java): [Seleziona]
        getListView().setOnItemClickListener(new OnItemClickListener() {
                       
                        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                                AlertDialog.Builder adb=new AlertDialog.Builder(S2.this);
                                adb.setTitle("Prova");
                                adb.setMessage("Oggetto = "+ getListView().getItemAtPosition(position) );
                                adb.setPositiveButton("Ok", null);
                                adb.show();
                        }
                });

come posso fare per ottenere un riferimento all'id dell'item così da poter fare una query e stampare il risultato?

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:ListView con dati provenienti da db
« Risposta #14 il: 01 Settembre 2010, 16:20:04 CEST »
+1
Codice (Java): [Seleziona]
long _id=adapter.getItemId(position)
http://www.google.com/codesearch/p?hl=it#uX1GffpyOZk/core/java/android/widget/CursorAdapter.java&q=CursorAdapter&sa=N&cd=1&ct=rc
linea 153:
Codice (Java): [Seleziona]
    public long getItemId(int position) {
        if (mDataValid && mCursor != null) {
            if (mCursor.moveToPosition(position)) {
                return mCursor.getLong(mRowIDColumn);
            } else {
                return 0;
            }
        } else {
            return 0;
        }
    }

ora, forse il parametro id passato nell onItemClick, corrisponde all'id nel database... ma non penso.


inoltre, puoi accedere ai dati visualizzati sull elemento della lista.

ad esempio

Codice (Java): [Seleziona]
getListView().setOnItemClickListener(new OnItemClickListener() {
                       
                        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                                TextView tv=(TextView)v.findViewById(R.id.evento);
                                String evtStr=tv.getText();


                });