Autore Topic: NullPointerException su set.adapter durante query per listview [Risolto]  (Letto 961 volte)

Offline Rickyc81

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Win8
Ciao a tutti, dopo mesi di studio sui libri ho messo mano ad un pò di codice, stò creando una mia app per l'assistenza tecnica di pc_notebook.
Questa app conterrà una anagrafica clienti residente in un db locale creato dalla app stessa. La parte relativa alle query di inserimento e popolamento del db funzionano e il db viene popolato in modo corretto, il problema l'ho nella presa dei dati per visualizzarli in listview.

posto il codice del mio dbHelper e il codice della activity che dovrebbe visualizzare in lista nome e cognome.

********
dbHelper

Codice (Java): [Seleziona]
package com.example.appassistenza;



import java.util.ArrayList;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.EditText;

public class DatabaseHelper {

        static SQLiteDatabase mDb = null;
        DbHelper mDbHelper;
        Context mContext;

        private static final String DB_NAME = "DB";// nome del db
        private static final int DB_VERSION = 1; // numero di versione del nostro db

        public DatabaseHelper(Context ctx) {
                System.out.println("ISTANZIATO DB");
                mContext = ctx;
                mDbHelper = new DbHelper(ctx, DB_NAME, null, DB_VERSION);
        }

        public void open() { // metodo per rendere leggibile/scrivibile il database
                mDb = mDbHelper.getWritableDatabase();

        }

        public void close() { // metodo per rendere leggibile/scrivibile il database
                mDb.close();
                System.out.println("Database chiuso");

        }

        static class AssistenzaDati {

                static final String ID = "_id";
                static final String RUBRICA = "assist_rubrica";
               
                static final String NOME = "nome";
                static final String COGNOME = "cognome";
                static final String INDIRIZZO = "indirizzo";
                static final String CITTA = "citta";
                static final String EMAIL = "email";
                static final String TELEFONO = "telefono";

        }

        private static final String CREA_TABELLA_ANAGRAFICA = "CREATE TABLE IF NOT EXISTS " // Creazione
                                                                                                                                                                                // Tabelle
                                                                                                                                                                                // della
                                                                                                                                                                                // rubrica
                        + AssistenzaDati.RUBRICA
                        + " ("
                        + AssistenzaDati.ID
                        + " integer primary key autoincrement, "
                       
                        + AssistenzaDati.NOME
                        + ", "
                        + AssistenzaDati.COGNOME
                        + ", "
                        + AssistenzaDati.INDIRIZZO
                        + ", "
                        + AssistenzaDati.CITTA
                        + ", "
                        + AssistenzaDati.EMAIL
                        + ", "
                        + AssistenzaDati.TELEFONO + ");";

        public void inserisciAnagraficaCliente(String nome, String cognome, // Metodo
                                                                                                                                                // per
                                                                                                                                                // inserire
                                                                                                                                                // i
                                                                                                                                                // dati
                                                                                                                                                // nelle
                                                                                                                                                // celle
                        String indirizzo, String citta, String email, String telefono) {

                System.out.println("Stò inserendo" + nome + " " + cognome + " "
                                + indirizzo + " " + citta + " " + email + " " + telefono);

                mDb.execSQL("INSERT INTO assist_rubrica( nome,cognome,indirizzo,citta,email,telefono) values ('"
                                + nome
                                + "','"
                                + cognome
                                + "','"
                                + indirizzo
                                + "','"
                                + citta
                                + "','" + email + "','" + telefono + "');");

                System.out.println("Contatto Inserito!");

        }

        private class DbHelper extends SQLiteOpenHelper {
                public DbHelper(Context context, String name, CursorFactory factory,
                                int version) {
                        super(context, name, factory, version);
                }

                @Override
                public void onCreate(SQLiteDatabase _db) {

                        _db.execSQL(CREA_TABELLA_ANAGRAFICA);
                }

                @Override
                public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                }

        }

        public static SQLiteDatabase getReadableDatabase() {
                // TODO Auto-generated method stub
                return null;

        }

        public static SQLiteDatabase getWritableDatabase() {
                // TODO Auto-generated method stub
                return null;

        }

        public String risolviNomeCliente() {
                System.out.println("Risolvo nome cliente");
                Cursor curNomeLista = mDb.rawQuery("SELECT nome FROM assist_rubrica; ", null);
                ArrayList<String> clienteList = new ArrayList<String>();
                if (curNomeLista != null) {
                        if (curNomeLista.moveToFirst()) {
                                do {
                                        String cliente = curNomeLista.getString(curNomeLista
                                                        .getColumnIndex("nome"));
                                        clienteList.add(cliente);
                                } while (curNomeLista.moveToNext());
                        }
                }
                String nomeCliente = clienteList.get(0);
                return nomeCliente;

        }

        public String risolviCognome() {
                System.out.println("Risolvo nome cliente");
                Cursor curNomeLista = mDb.rawQuery(
                                "SELECT cognome FROM assist_rubrica; ", null);
                ArrayList<String> clienteList = new ArrayList<String>();
                if (curNomeLista != null) {
                        if (curNomeLista.moveToFirst()) {
                                do {
                                        String cliente = curNomeLista.getString(curNomeLista
                                                        .getColumnIndex("cognome"));
                                        clienteList.add(cliente);
                                } while (curNomeLista.moveToNext());
                        }
                }
                String cognomeCliente = clienteList.get(0);
                return cognomeCliente;
        }

        public  Cursor fetchNomiCognomi() {
                System.out.println("Inizio il fetch degli Studi");
                return mDb.rawQuery(
                                "SELECT nome, cognome FROM assist_rubrica ;", null);
        }

}

ci sono due metodi che al momento non uso cioè "risolviNomeCliente();" e "risolviCognomeCliente();"

questo è il codice della activity per la listview

Codice (Java): [Seleziona]
package com.example.appassistenza;

import java.util.ArrayList;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class DettagliRubrica extends Activity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                super.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

                final DatabaseHelper database = new DatabaseHelper(
                                getApplicationContext());
                database.open();

                final ListView listViewRubrica = (ListView) findViewById(R.id.listViewRubrica);

                listaNomiCognomi(database, listViewRubrica);

                System.out.println("parto");

        }

        public void listaNomiCognomi(final DatabaseHelper database,
                        final ListView listViewRubrica) {
                        final Cursor curNomiCognomi = database.fetchNomiCognomi();

                ArrayList<String> nomiList = new ArrayList<String>();
                ArrayList<String> cognomiList = new ArrayList<String>();

                if (curNomiCognomi != null) {

                        if (curNomiCognomi.moveToFirst()) {

                                do {
                                        String nome = curNomiCognomi.getString(curNomiCognomi
                                                        .getColumnIndex("nome"));
                                        String cognome = curNomiCognomi.getString(curNomiCognomi
                                                        .getColumnIndex("cognome"));

                                        System.out.println("Trovato " + nome + " " + cognome);

                                        nomiList.add(nome);
                                        cognomiList.add(cognome);
                                        System.out.println("parto2");
                                } while (curNomiCognomi.moveToNext());

                        }
                }

                if (nomiList.size() < 1) {
                        TextView elencoClienti = (TextView) findViewById(R.id.elencoClienti);
                        elencoClienti.setText("Elenco clienti vuoto!");
                       
                }

                        if (nomiList.size() > 0) {
                               
                                final String[] arNomiCli = new String[nomiList.size()];
                                final String[] arCognCli = new String[nomiList.size()];
                                final String[] arNomiCognomiCli = new String[nomiList.size()];

                                for (int i = 0; i < nomiList.size(); i++) {

                                        arNomiCli[i] = nomiList.get(i);
                                        arCognCli[i] = cognomiList.get(i);
                                        arNomiCognomiCli[i] = arNomiCli[i] + " " + arCognCli[i];

                                }

                                ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,
                                                android.R.layout.simple_list_item_1,arNomiCognomiCli);
                                listViewRubrica.setAdapter(arrayAdapter);

                        }
                }
        }

dove in pratica vorrei fare una query della colonna "nome" e "cognome" prendere questi dati metterli in stringa, poi creare un'arraylist e unire nome e cognome e darli in pasto all'adapter

ma quando clicco sul bottone che fà partire la listview mi crasha l'app dando questo errore in log


 
Codice: [Seleziona]
10-10 20:37:11.041: I/System.out(4225): ISTANZIATO DB
10-10 20:37:11.071: I/System.out(4225): Inizio il fetch degli Studi
10-10 20:37:11.071: I/System.out(4225): Trovato hshhss hshshs
10-10 20:37:11.071: I/System.out(4225): parto2
10-10 20:37:11.081: D/AndroidRuntime(4225): Shutting down VM
10-10 20:37:11.081: W/dalvikvm(4225): threadid=1: thread exiting with uncaught exception (group=0x41b9a700)
10-10 20:37:11.081: E/AndroidRuntime(4225): FATAL EXCEPTION: main
10-10 20:37:11.081: E/AndroidRuntime(4225): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.appassistenza/com.example.appassistenza.DettagliRubrica}: java.lang.NullPointerException
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.app.ActivityThread.access$600(ActivityThread.java:141)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.os.Looper.loop(Looper.java:137)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.app.ActivityThread.main(ActivityThread.java:5103)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at java.lang.reflect.Method.invokeNative(Native Method)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at java.lang.reflect.Method.invoke(Method.java:525)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at dalvik.system.NativeStart.main(Native Method)
10-10 20:37:11.081: E/AndroidRuntime(4225): Caused by: java.lang.NullPointerException
10-10 20:37:11.081: E/AndroidRuntime(4225):         at com.example.appassistenza.DettagliRubrica.listaNomiCognomi(DettagliRubrica.java:81)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at com.example.appassistenza.DettagliRubrica.onCreate(DettagliRubrica.java:26)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.app.Activity.performCreate(Activity.java:5133)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
10-10 20:37:11.081: E/AndroidRuntime(4225):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
10-10 20:37:11.081: E/AndroidRuntime(4225):         ... 11 more

stò imparando adesso a leggere il logcat, vedendo che è molto utile per la diagnositica di questi problemi, ma non riesco da solo.

vedo che il problema lo segna sulla riga 81 e cioè             
Codice (Java): [Seleziona]
                                listViewRubrica.setAdapter(arrayAdapter);
ma non capisco cosa sbaglio, vedo anche che c'è un errore per la riga 26

quindi
Codice (Java): [Seleziona]
                listaNomiCognomi(database, listViewRubrica);
ora non capisco dove stà il problema, saranno troppi giorni che ci sono su e non riesco a vedere magari una banalità, ho lavorato in team con un mio amico che ha il codice gemello nella sua app e da lui funziona solo che fà una query con un SELECT .. FROM.. WHERE ... al contrario del mio..

se qualcuno è disponibile per aiutarmi ve ne sarei tanto grato e andateci piano che sono ancora un nabbo junior..

Ciao
Riccardo

Ps. se ho dimenticato qualcosa fatemi sapere che vi informo... :)
« Ultima modifica: 11 Ottobre 2013, 16:10:34 CEST da Rickyc81 »

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:NullPointerException su set.adapter durante query per listview
« Risposta #1 il: 10 Ottobre 2013, 20:50:30 CEST »
0
Quelli che ti sembrano due errori, sono in realtà lo stesso errore. Quella lista è lo stack delle chiamate a funzioni e ad ogni riga scendi (o risali, dipende come la vedi) di un livello.

L'errore è un NullPointerException in questa riga: listViewRubrica.setAdapter(arrayAdapter);

Presumibilmente uno dei due oggetti è NULL. Per verificare, prima di quella riga, metti un Log.d("TAG","listViewRubrica = "+listViewRubrica+" arrayadapter = "+arrayAdapter);
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Rickyc81

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Win8
Re:NullPointerException su set.adapter durante query per listview
« Risposta #2 il: 10 Ottobre 2013, 21:14:51 CEST »
0
Grazie bradipao faccio e ti aggiorno!

Inviato dal mio Nexus 4 con Tapatalk now Free



Post unito: 10 Ottobre 2013, 21:20:16 CEST
mi stò accorgendo di una cosa,

avevo inserito un Syso nei
Codice (Java): [Seleziona]
 get.ColumnIndex e ho visto che il log mi ha trovato il nome e cognome (
Codice: [Seleziona]
10-10 20:37:11.071: I/System.out(4225): Trovato hshhss hshshs ) che è salvato nel dB ... quindi fino a quella parte il codice funziona  e la query è ok.. il problema stà piu avanti..

:)

Post unito: 10 Ottobre 2013, 23:50:49 CEST
è uscito fuori questo

Codice: [Seleziona]
10-10 23:46:27.899: D/TAG(3979): listViewRubrica = null arrayadapter = android.widget.ArrayAdapter@42323650
« Ultima modifica: 10 Ottobre 2013, 23:50:50 CEST da Rickyc81, Reason: Merged DoublePost »

Offline Rickyc81

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Win8
Re:NullPointerException su set.adapter durante query per listview
« Risposta #3 il: 11 Ottobre 2013, 11:21:31 CEST »
0
Grazie bradipao faccio e ti aggiorno!

Inviato dal mio Nexus 4 con Tapatalk now Free



Post unito: 10 Ottobre 2013, 21:20:16 CEST
mi stò accorgendo di una cosa,

avevo inserito un Syso nei
Codice (Java): [Seleziona]
 get.ColumnIndex e ho visto che il log mi ha trovato il nome e cognome (
Codice: [Seleziona]
10-10 20:37:11.071: I/System.out(4225): Trovato hshhss hshshs ) che è salvato nel dB ... quindi fino a quella parte il codice funziona  e la query è ok.. il problema stà piu avanti..

:)

Post unito: 10 Ottobre 2013, 23:50:49 CEST
è uscito fuori questo

Codice: [Seleziona]
10-10 23:46:27.899: D/TAG(3979): listViewRubrica = null arrayadapter = android.widget.ArrayAdapter@42323650

Può essere un errore di indirizzamento del layout della listview?

Inviato dal mio Nexus 4 con Tapatalk now Free


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:NullPointerException su set.adapter durante query per listview
« Risposta #4 il: 11 Ottobre 2013, 12:00:47 CEST »
+1
Può essere un errore di indirizzamento del layout della listview?

Si, potresti aver sbagliato a scrivere l'id della ListView. Verifica nel file di layout. Poi prova a mettere un Log.d() subito dopo il findViewById().
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Rickyc81

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Win8
Re:NullPointerException su set.adapter durante query per listview
« Risposta #5 il: 11 Ottobre 2013, 13:32:22 CEST »
0
E in questo caso come lo uso il Log.d() ? Lo sto' conoscendo adesso.. :(

Inviato dal mio Nexus 4 con Tapatalk now Free

Codice (XML): [Seleziona]
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >

    <ListView
       android:id="@+id/listViewRubrica"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:textSize="10sp"
       >
    </ListView>

</LinearLayout>

Questo è quello che ho scritto nel file listviewrubrica.xml cosa sbaglio?
« Ultima modifica: 11 Ottobre 2013, 13:38:10 CEST da Rickyc81 »

Offline Rickyc81

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Win8
Re:NullPointerException su set.adapter durante query per listview
« Risposta #6 il: 11 Ottobre 2013, 15:23:57 CEST »
0
Risolto! Dato che ho usato un layout per la listview ho dimenticato il relativo setContentView prima della dichiarazione della listview....

Inviato dal mio Nexus 4 con Tapatalk now Free


Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +153
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:NullPointerException su set.adapter durante query per listview [Risolto]
« Risposta #7 il: 14 Ottobre 2013, 22:59:50 CEST »
0
Codice (XML): [Seleziona]
<ListView
      android:id="@+id/listViewRubrica"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:textSize="10sp"
      >
    </ListView>

Usare  android:layout_height="wrap_content" su una ListView è sbagliato.
Costringi la ListView a calcolare continuamente la sua altezza in base al suo contenuto.

Offline Rickyc81

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus4
  • Sistema operativo:
    Win8
Re:NullPointerException su set.adapter durante query per listview [Risolto]
« Risposta #8 il: 14 Ottobre 2013, 23:09:49 CEST »
0
OK! Grazie!!  Quindi tutto match?

Inviato dal mio Nexus 4 con Tapatalk now Free