2016-05-22 15 views
0

Momentan arbeite ich mit einer Listenansicht, die Listenansicht enthält drei Werte, ID, Titel und Beschreibung. HierAusgewähltes Listenansichtselement, das einen Nullobjekt-Referenzfehler angibt

ist die XML für die Listenansicht ..

<?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="wrap_content" 
    android:orientation="vertical"> 
    <LinearLayout 
     android:id="@+id/Ln" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal" 
     android:scrollbars="horizontal" 
     android:weightSum="4" > 
     <TextView 
      android:id="@+id/txtNoteID" 
      android:layout_width="0dp" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.39" 
      android:gravity="center" 
      android:text="0" 
      android:textSize="20sp" /> 
     <TextView 
      android:id="@+id/txtTitle" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:textSize="20sp" 
      android:text="Pub" /> 
    </LinearLayout> 

    <TextView 
     android:id="@+id/txtDesc" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:textSize="20sp" 
     android:text="PubTest" /> 

</LinearLayout> 

Die Liste mit Daten aus einer Datenbank gefüllt wird, und alles funktioniert bis zu diesem Punkt. Allerdings muss ich in der Lage sein, Elemente aus der Datenbank zu löschen. Ich dachte, ein Kontextmenü zu haben, wenn ein Element angeklickt wird, wäre am einfachsten, da der Benutzer das Element auswählen kann, das gelöscht werden soll. ich erhalte jedoch diesen Fehler

"java.lang.NullPointerException: Der Versuch, virtuelle Methode 'java.lang.CharSequence android.widget.TextView.getText()' auf null Objektverweis aufrufen"

Dies ist das Kontextmenü Code löschen ...

public boolean onContextItemSelected(MenuItem item) 
{ 
    //AdapterView.AdapterContextMenuInfo Info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
    switch (item.getItemId()) { 
     case R.id.DeleteItem: { 
      DB = new DBController(getApplicationContext()); 
      SQLiteDatabase db = DB.getWritableDatabase(); 
      db.delete("NOTES", "ID=" + NoteID.getText().toString(), null); 
      Toast.makeText(StoredNoteList.this, "deleted successfully", Toast.LENGTH_SHORT).show(); 
      Adapter.notifyDataSetChanged(); 
      return true; 
     } 
    } 

ich ziemlich sicher bin, dass das Problem mit dem (NoteID.getText ist) toString() -. Meine Theorie ist, dass, wenn ich wählen etwas von der Liste, das es em ID ausgewählt Wird nicht in der NoteID Variable gespeichert, dies ist jedoch nur eine Theorie.

Für diejenigen, die für die NoteID fragte Deklarieren und Zuweisen der NoteID

TextView NoteID,NoteTitle,NoteDesc; 
NoteID=(TextView)findViewById(R.id.txtNoteID); 

Nach einigen Änderungen ich jetzt sehe, dass meine NoteID definitiv null ist

public boolean onContextItemSelected(MenuItem item) 
    { 
     //AdapterView.AdapterContextMenuInfo Info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 
     NoteList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       ID =((TextView)parent.findViewById(R.id.txtNoteID)).getText().toString(); 
      } 
     }); 
     switch (item.getItemId()) 
     { 
      case R.id.DeleteItem: 
      { 
       DB = new DBController(getApplicationContext()); 
       SQLiteDatabase db = DB.getWritableDatabase(); 
       db.delete("NOTES", "ID=" + ID, null); 
       Toast.makeText(StoredNoteList.this,"deleted successfully", Toast.LENGTH_SHORT).show(); 
       Adapter.notifyDataSetChanged(); 
       return true; 
      } 

Der Debugger zeigt mir NoteID ist Ich denke, sobald ich einen Weg gefunden habe, die ausgewählte ID aus der Artikelliste in die NoteID-Variable zu speichern, sollte meine App problemlos funktionieren.

Hier ist mein Adapter-Code für jeden, der interessiert sind

Adapter = new SimpleAdapter(StoredNoteList.this, Data, R.layout.rows,new String[]{"ID","TITLE","DESCRIPTION"}, new int[]{R.id.txtNoteID,R.id.txtTitle,R.id.txtDesc}); 
NoteList.setAdapter(Adapter); 

Jede Hilfe würde geschätzt, Dank

+1

Können Sie den Code anzeigen, in dem die Variable '' NoteID'' erstellt wird? Eine vollständige Stapelverfolgung wäre ebenfalls hilfreich. – Kamil

+0

Bitte beachten Sie, dass Variablen mit Kleinbuchstaben beginnen sollten. Es ist eine Java-Codierungskonvention –

Antwort

0

Sind Sie einen benutzerdefinierten Adapter verwenden? Ich denke dein Problem ist, dass es nicht weiß, welche NoteID zu bekommen. Es gibt effektiv eine Reihe von Elementen mit der txtNoteID wegen der ListView. Sie würde also von etwas entlang der Linien zu tun:

NoteList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      ID = view.getText().toString(); 
     } 
    }); 

Der Blick in den onItemClick sollte die richtige Ansicht sein, Sie müssen Eltern greifen und eine Suche nach dem txtNoteID im Rahmen des Listview-Elements zu tun though so ...

((TextView)parent.findViewById(R.id.txtNoteID)).getText().toString() 
+0

Ich habe meinen Adaptercode hinzugefügt, wenn Sie es sich ansehen möchten. Ich verstehe, was Sie damit meinen, nicht zu wissen, welche NoteID zu verwenden, ich dachte, dass der ItemClickListener nur mit dem ausgewählten Element arbeitete, so dass ich nicht dachte, dass dies ein Problem wäre. Wo genau sollte ich die zweite Codezeile setzen, die du gepostet hast? Ich bin ein wenig verloren auf diesem – Demonic217

+0

ID = view.getText(). ToString(); würde durch diese zweite Codezeile ersetzt werden. ID = ((Textansicht) parent.findViewById (R.id.txtNoteID)). getText(). toString() basierend auf dem Adapter-Code, würde ich sagen, verwenden Sie die zweite Zeile des Codes anstelle des ersten. Es sollte dann für Sie arbeiten. – aminner

+0

Um klar zu sein ...... '' NoteList.setOnItemClickListener (neu AdapterView.OnItemClickListener() { @Override public void onItemClick (AdapterView Elternteil, Ansicht Ansicht, int Position, long id) { ID = ((TextView) parent.findViewById (R.id.txtNoteID)). GetText(). ToString(); } }); '' Dies gibt mir aber immer noch einen Nullwert – Demonic217

Verwandte Themen