Autore Topic: ListView semplice semplice  (Letto 767 volte)

Offline pibraccus

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note
  • Sistema operativo:
    Windows
ListView semplice semplice
« il: 27 Settembre 2012, 20:12:29 CEST »
0
Salve ragazzi,

quasi quasi mi vergogno a chiedervi aiuto per una simile banalità. Piuttosto che limitarmi a un semplice copia e incolla dei vari tutorial trovati qua e là senza che impari nulla, mi sono deciso a studiare bene le ListView e gli adapter. Ebbene mi trovo alla mia primissima listview la più semplice e banale che possa esistere eppure non mi funziona e mi ritorna una nullpointer exception, non c'è bisogno che vi spieghi come ci si sente in questi frangenti, meno male che non ho oggetti di valore a portata di mano...

Di seguito il codice che mi tormenta:

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

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;

public class Famiglia extends Activity {
       

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_famiglia);

                ListView listview = (ListView) findViewById(R.id.listView);

                ArrayAdapter<String> arrayadapter = new ArrayAdapter<String>(this,
                                R.layout.activity_famiglia, R.id.elementostringa);
                arrayadapter.add("Beppe");
                arrayadapter.add("Filomena");
                arrayadapter.add("Pipino");
                arrayadapter.add("Agamennone");
                arrayadapter.add("Beatrix");

                listview.setAdapter(arrayadapter);

        }
}

activity_famiglia:

Codice: [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" >

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>
</LinearLayout>

stringa famiglia:

Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/widget30"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="4dip" >

    <TextView
        android:id="@+id/elementostringa"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </TextView>

</RelativeLayout>

il logcat:

Codice: [Seleziona]
09-27 20:07:30.020: W/dalvikvm(19439): threadid=1: thread exiting with uncaught exception (group=0x40c621f8)
09-27 20:07:30.030: E/AndroidRuntime(19439): FATAL EXCEPTION: main
09-27 20:07:30.030: E/AndroidRuntime(19439): java.lang.NullPointerException
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:392)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.AbsListView.obtainView(AbsListView.java:2219)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.ListView.makeAndAddView(ListView.java:1774)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.ListView.fillDown(ListView.java:672)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.ListView.fillFromTop(ListView.java:732)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.ListView.layoutChildren(ListView.java:1625)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.AbsListView.onLayout(AbsListView.java:2049)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.View.layout(View.java:11484)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.ViewGroup.layout(ViewGroup.java:4229)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.LinearLayout.onLayout(LinearLayout.java:1415)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.View.layout(View.java:11484)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.ViewGroup.layout(ViewGroup.java:4229)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.View.layout(View.java:11484)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.ViewGroup.layout(ViewGroup.java:4229)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1644)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1502)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.LinearLayout.onLayout(LinearLayout.java:1415)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.View.layout(View.java:11484)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.ViewGroup.layout(ViewGroup.java:4229)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.FrameLayout.onLayout(FrameLayout.java:431)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.View.layout(View.java:11484)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.ViewGroup.layout(ViewGroup.java:4229)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1671)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2628)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.os.Handler.dispatchMessage(Handler.java:99)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.os.Looper.loop(Looper.java:137)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.app.ActivityThread.main(ActivityThread.java:4511)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at java.lang.reflect.Method.invokeNative(Native Method)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at java.lang.reflect.Method.invoke(Method.java:511)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
09-27 20:07:30.030: E/AndroidRuntime(19439):         at dalvik.system.NativeStart.main(Native Method)


Grazie in anticipo


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:ListView semplice semplice
« Risposta #1 il: 27 Settembre 2012, 20:33:25 CEST »
+1
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline pibraccus

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note
  • Sistema operativo:
    Windows
Re:ListView semplice semplice
« Risposta #2 il: 27 Settembre 2012, 20:37:31 CEST »
0
Grazie Bradipao stavo proprio scrivendo che avevo risolto usando la seguente stringa:

Codice (Java): [Seleziona]
ArrayAdapter<String> arrayadapter = new ArrayAdapter<String>(this,
                                android.R.layout.simple_list_item_1, items);

non prima di aver creato un array di stringhe items naturalmente. Solo che così non so cosa ci sta dietro al simple_list_item_1 di android nel senso che so che è una view preimpostata che si confa al mio caso specifico ma devo accettare il tutto passivamente... Non so se mi spiego

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:ListView semplice semplice
« Risposta #3 il: 27 Settembre 2012, 20:52:54 CEST »
0
Android è open souce, il file del layout "simple_list_item_1.xml" si trova nei sorgenti:

http://androidxref.com/source/xref/frameworks/base/core/res/res/layout/simple_list_item_1.xml
adb logcat | tee /tmp/logcat | grep TAG

Offline pibraccus

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note
  • Sistema operativo:
    Windows
Re:ListView semplice semplice
« Risposta #4 il: 27 Settembre 2012, 21:24:16 CEST »
0
Android è open souce, il file del layout "simple_list_item_1.xml" si trova nei sorgenti:

http://androidxref.com/source/xref/frameworks/base/core/res/res/layout/simple_list_item_1.xml

Grazie mille per il suggerimento iceweasel! Ahimé già sapevo che Android è open souRce e che se voglio posso prendere visione del codice sorgente. Nello specifico grazie al link che mi hai inviato:

Codice (XML): [Seleziona]
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceListItemSmall"
android:gravity="center_vertical"
android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
android:paddingRight="?android:attr/listPreferredItemPaddingRight"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
/>

posso vedere com'è fatto l'elemento TextView text1. Così scopro che per comprendere appieno di cosa è composto dovrei andare a vedere cosa sono tutti quegli attributi ?android...

Purtroppo ho posto male la domanda, se volessi impostare io il tutto senza ricorrere al simple_list_item_1 cosa dovrei scrivere?

il costrutto dell'arrayadapter è il seguente:

Codice: [Seleziona]
android.widget.ArrayAdapter.ArrayAdapter<String>(Context context, int resource, int textViewResourceId, String[] objects)
io quindi avevo creato il mio adapter così:

Codice (Java): [Seleziona]
ArrayAdapter<String> arrayadapter = new ArrayAdapter<String>(this, R.layout.activity_famiglia, R.id.elementostringa);dove this è chiaramente il contesto, R.layout.activity_famiglia è l'intero che punta alla risorsa, e R.id.elementostringa è l'intero che punta alla view da popolare.

Poi attraverso l'istruzione:
arrayadapter.add  aggiungevo i valori che avrebbero dovuto popolare la listview. Tuttora non mi riesco a spiegare perché non funzioni e mi sarebbe piaciuto capirlo, anche perché ci ho perso e ci sto perdendo troppo tempo. Non voglio accettare passivamente il parametro di android e andare avanti. Tanto vale allora scaricarsi una libreria che mi crea la listview e il listener con un riga di codice... Ma così non ne capirei niente lo stesso. Capisco che magari forse è un problema tutto mio e che non ha senso perdersi in una cosa così stupida e se nessuno mi risponde lo comprendo benissimo. Io però ci provo lo stesso: esiste qualcuno che mi sappia dire cosa c'era di sbagliato nel codice del mio primo post di questo topic? Grazie  :D

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:ListView semplice semplice
« Risposta #5 il: 27 Settembre 2012, 22:49:54 CEST »
0
esiste qualcuno che mi sappia dire cosa c'era di sbagliato nel codice del mio primo post di questo topic? Grazie  :D

Un modo per correggere gli errori è quello di confrontare il codice  con un codice corretto pre-esistente, come suggerito da bradipao.

Un altro modo è leggere con attenzione l'errore:

Codice: [Seleziona]
java.lang.NullPointerException
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:392)

Prendere i sorgenti di Android per vedere cosa c'è nel file ArrayAdapter.java alla riga 392 (dipende esattamente dalla versione quindi il numero di riga può variare):

Codice: [Seleziona]
...
        T item = getItem(position);
        if (item instanceof CharSequence) {
            text.setText((CharSequence)item);  // <- errore
        } else {
            text.setText(item.toString());
        }
...

Cosa in quella riga è null e ha generato l'errore ? La risposta è semplice "text", come è passato text, da un parametro del adapter, è corretto ? La risposta è no:

Codice: [Seleziona]
setContentView(R.layout.activity_famiglia);
...
ArrayAdapter<String> arrayadapter = new ArrayAdapter<String>(this,
                                R.layout.activity_famiglia, R.id.elementostringa);
...

Usi lo stesso layout sia per activity che per arrayadapter.
adb logcat | tee /tmp/logcat | grep TAG

Offline pibraccus

  • Nuovo arrivato
  • *
  • Post: 20
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Note
  • Sistema operativo:
    Windows
Re:ListView semplice semplice
« Risposta #6 il: 27 Settembre 2012, 23:10:57 CEST »
0
Un modo per correggere gli errori è quello di confrontare il codice  con un codice corretto pre-esistente, come suggerito da bradipao.

Un altro modo è leggere con attenzione l'errore:

Codice: [Seleziona]
java.lang.NullPointerException
09-27 20:07:30.030: E/AndroidRuntime(19439):         at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:392)

Prendere i sorgenti di Android per vedere cosa c'è nel file ArrayAdapter.java alla riga 392 (dipende esattamente dalla versione quindi il numero di riga può variare):

Codice: [Seleziona]
...
        T item = getItem(position);
        if (item instanceof CharSequence) {
            text.setText((CharSequence)item);  // <- errore
        } else {
            text.setText(item.toString());
        }
...

Cosa in quella riga è null e ha generato l'errore ? La risposta è semplice "text", come è passato text, da un parametro del adapter, è corretto ? La risposta è no:

Codice: [Seleziona]
setContentView(R.layout.activity_famiglia);
...
ArrayAdapter<String> arrayadapter = new ArrayAdapter<String>(this,
                                R.layout.activity_famiglia, R.id.elementostringa);
...

Usi lo stesso layout sia per activity che per arrayadapter.

Grazie nuovamente per la tua risposta Iceweasel, purtroppo però pur mettendo R.layout.stringa_famiglia (che in realtà era quello che avevo messo sin dall'inizio e non so come sia cambiato nel post), che è il codice della singola stringa della listview mi da sempre errore. Grazie davvero comunque per l'aiuto che stai cercando di darmi, lo apprezzo tantissimo.
Non fa niente se non trovo la soluzione. E' cosa comunque di poco conto, superabile usando altri metodi.

P.S. La soluzione suggerita da Bradipao, come lui stesso sottolinea, è quasi uguale alla mia, infatti in quel link che mi ha suggerito lo sviluppatore usa il parametro simple_list_item_1, non si tratta ahimé di un codice corretto pre-esistente.