Autore Topic: ListView, nullPointer nei pulsanti, help!  (Letto 374 volte)

Offline tune

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S2
  • Sistema operativo:
    Win 8
ListView, nullPointer nei pulsanti, help!
« il: 14 Marzo 2013, 12:48:29 CET »
0
Ciao ragazzi,
ho un problema con una listView semplicissima e dei pulsanti che in realtà sono delle ImageView che sono rispettivamente "Delete/Edit", ogni riga del listView ha questi due pulsanti che appunto ti permettono di cancellare e editare l'oggetto della lista. (i classici crud)

questo è il mio codice nel MainActivity che estende l'interfaccia "onClickListener":
Codice (Java): [Seleziona]
public class MainActivity extends Activity implements OnClickListener{
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
               
        ListView listView = (ListView)findViewById(R.id.lista);
        // mi faccio un getAll delle note e lo passo all'adapter
        NotaCrud crud = new NotaCrud(this);
        List<Nota> listaNote = crud.getListNotes();
        ListaNotaAdapter adattatore = new ListaNotaAdapter(this, R.layout.row, listaNote);
        listView.setAdapter(adattatore);
       
        ImageView delete = (ImageView)findViewById(R.id.button_row_delete);
        ImageView edit = (ImageView)findViewById(R.id.button_row_edit);
        delete.setOnClickListener(this);
        edit.setOnClickListener(this);
        }
       
       
       
       

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }
       
       
       
        public void addNote(View view){
                Log.i(MainActivity.class.getName(), "addNote()");
                Intent intent = new Intent( this, InsertNoteActivity.class );
                startActivity(intent);
        }





        @Override
        public void onClick(View v) {
                int idnota = (Integer)v.getTag();
                String msg = "ID nota: " + idnota;
                Toast.makeText( getApplicationContext(), msg, Toast.LENGTH_SHORT).show();              
        }
...

la lista viene popolata dall'adapter:
Codice (Java): [Seleziona]
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
               
                View row = null;
               
                //*** prima di tutto è necessario crearsi un oggetto inflater che
                //*** intrinsecamente associ il contesto attuale su cui si sta agendo
                //*** e il servizio che si è richiesto "layout_inflater"
                LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
               
                //*** una volta che ho l'oggetto inflater che associa contesto+servizio posso procedere
                //*** nell'identificazione dell'xml da usare
                row = inflater.inflate(R.layout.row, null );
               
                //*** una volta che ho la vista relativa al contesto attuale e relativa all'xml desiderato per layout
                //*** mi richiamo i propri elementi interni a cui associare i dati dell'oggetto item di turno
                TextView data           = (TextView)row.findViewById(R.id.item_data);
                TextView oggetto        = (TextView)row.findViewById(R.id.item_oggetto);
                ImageButton delete      = (ImageButton)row.findViewById(R.id.button_row_delete);
                ImageButton edit        = (ImageButton)row.findViewById(R.id.button_row_edit);
               
                //*** prende l'oggetto nell'array "Nota[] objects" passato in argomento
                //*** dato il proprio indice di posizione
                Nota nota = getItem(position);
               
                //**** in fine associo agli appositi oggetti "TextView" i rispettivi valori
                data.setText(nota.get_dataInserimentoModifica());
                oggetto.setText(nota.get_oggetto());
               
                //*** poi associo i tag ai relativi pulsanti "Delete" e "Edit"
                delete.setTag(nota.get_id());
                edit.setTag(nota.get_id());
               
                //*** torno la vista che finirà dentro "setAdapter()"
                return row;
        }

l'errore è che becco un nullPointer nel main, ecco il logat:
Codice (Java): [Seleziona]
03-14 12:39:50.950: E/AndroidRuntime(32136): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.prendonota/com.prendonota.MainActivity}: java.lang.NullPointerException
03-14 12:39:50.950: E/AndroidRuntime(32136):    at com.prendonota.MainActivity.onCreate(MainActivity.java:35)

la riga 35 sarebbe:
Codice (Java): [Seleziona]
delete.setOnClickListener(this);
perchè non viene popolata questa View? eppure nel XML di riferimento cè benissimo!
grazie in anticpio ragazzi!!

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:ListView, nullPointer nei pulsanti, help!
« Risposta #1 il: 14 Marzo 2013, 13:56:34 CET »
+1
Perché nel layout identificato da R.layout.activity_main non c'è il componente R.id.button_row_delete.
Forse l'hai in R.layout.row, ma in R.layout.activity_main no di certo.
« Ultima modifica: 14 Marzo 2013, 13:58:54 CET da Sakazaki »

Offline tune

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung S2
  • Sistema operativo:
    Win 8
Re:ListView, nullPointer nei pulsanti, help!
« Risposta #2 il: 14 Marzo 2013, 14:24:05 CET »
0
Grazie della risposta Sakazaki,
in effetti nell'xml main non c'è il tag xml relativo al button, come puoi vedere dell'xml che ho incollato,
Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".MainActivity">

    <Button
       android:id="@+id/add_nota"
       android:onClick="addNote"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_alignParentLeft="true"
       android:layout_alignParentRight="true"
       android:layout_alignParentTop="true"
       android:text="@string/add_nota_label" />

    <ListView
       android:id="@+id/lista"
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
       android:layout_below="@id/add_nota" >

    </ListView>

</RelativeLayout>
la cosa che mi ha tratto in inganno è stata pensare che siccome row.xml (dove infatti esiste il button ) viene chiamata ad ogni riga del "ListView" presente nel main.xml, ho pensato, sbagliando, che richiamando l'id del bottone presente su row.xml dal main potesse essere "visibile".
cmq, grazie, ho capito che così non è.

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:ListView, nullPointer nei pulsanti, help!
« Risposta #3 il: 14 Marzo 2013, 14:28:48 CET »
0
Di nulla  :-)
Per il futuro tieni presente che i vari xml di layout lavorano in modo indipendente tra loro, non mischiano mai i loro contenuti e riferimenti nemmeno a livello di codice. Ma ho inteso che hai capito  ;-)