0

Ich habe eine Listview, auf der ich Daten aus meiner Datenbank zeige und jetzt möchte ich Zeile auf der Basis der Schaltfläche gelöscht klicken, die mit jeder Zeile verknüpft ist.Löschen einer Zeile aus einem ListView mit dem zugehörigen Button

Ich habe Ausnahme in CustomAdapter-Klasse, wenn ich Done-Taste drücke. Cursor Code ist dies:

public class CustomAdapter extends CursorAdapter { 
    TextView task,daate; 
    Button del; 
    public static int id; 
    Context ct; 
    public CustomAdapter(Context context, Cursor cursor) { 
    super(context, cursor, 0); 
} 

// The newView method is used to inflate a new view and return it, 
// you don't bind any data to the view at this point. 
@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    ct=context; 
    return LayoutInflater.from(context).inflate(R.layout.adapter, parent, false); 

} 

// The bindView method is used to bind all data to a given view 
// such as setting the text on a TextView. 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final DatabaseHelper help=new DatabaseHelper(ct); 
    del = (Button) convertView.findViewById(R.id.deleteBtn); 
    del.setOnClickListener(new View.OnClickListener() { 
           @Override 
           public void onClick(View v) { 
            help.deleteRecordWithId(position); 
           } 
          } 
    ); 
    return super.getView(position, convertView, parent); 
} 


@Override 
public void bindView(View view, Context context, final Cursor cursor) { 
    // Find fields to populate in inflated template 
     task = (TextView) view.findViewById(R.id.dynamicTask); 
     daate = (TextView) view.findViewById(R.id.dynamicDate); 
     id=cursor.getInt(cursor.getColumnIndex("_id")); 
    String Task=cursor.getString(cursor.getColumnIndex("task")); 
    String Daate=cursor.getString(cursor.getColumnIndex("ddate")); 
    task.setText(Task); 
    daate.setText(Daate); 
} 

}

und meine Datenbankfunktion deleteRecordWithId() ist:

public boolean deleteRecordWithId(int id) { 
    SQLiteDatabase db=this.getWritableDatabase(); 
    long rows=db.delete(TABLE_NAME,"_id=?",new String[] {String.valueOf(id)}); 
    if(rows>0) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

und ich erhalte diese Ausnahme:

java.lang.NullPointerException: Attempt to invoke virtual method 
    'android.view.View android.view.View.findViewById(int)' on a null object 
    reference 

Was ist falsch in diesem Code. Bitte hilf mir, es zu korrigieren.

+1

Mögliches Duplikat [Was für eine Nullpointer ist, und wie kann ich es beheben?] (Https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how- do-i-fix-it) –

+0

Die View, auf die Sie 'findViewById' aufrufen, ist null. Überprüfen Sie, ob Sie die Ansicht initialisieren. Verwenden Sie auch 'RecyclerView' und nicht 'ListView's, da es leistungsfähig ist –

+0

warum es nullpointer Ausnahme zeigt?Ich habe es mit seiner ID definiert – Suraj

Antwort

0

Erste Methode: Sie beschreiben, wie die

public class CustomAdapter extends CursorAdapter { 

TextView task,daate; 
Button del; 
public static int id; 
Context ct; 
public CustomAdapter(Context context, Cursor cursor) { 
    super(context, cursor, 0); 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    ct=context; 
    return LayoutInflater.from(context).inflate(R.layout.adapter, parent, false); 

} 

@Override 
public void bindView(View view, Context context, final Cursor cursor) { 
    // Find fields to populate in inflated template 
    task = (TextView) view.findViewById(R.id.dynamicTask); 
    daate = (TextView) view.findViewById(R.id.dynamicDate); 
    id=cursor.getInt(cursor.getColumnIndex("_id")); 
    String Task=cursor.getString(cursor.getColumnIndex("task")); 
    String Daate=cursor.getString(cursor.getColumnIndex("ddate")); 
    task.setText(Task); 
    daate.setText(Daate); 
    final DatabaseHelper help=new DatabaseHelper(ct); 
    del = (Button) convertView.findViewById(R.id.deleteBtn); 
}} 

MainActivity:

und xml wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/task_outer_container" 
       android:layout_width="match_parent" 
       xmlns:app="http://schemas.android.com/apk/res-auto" 
       android:gravity="center_vertical" 
       android:background="@drawable/background_transparent" 
       android:layout_height="wrap_content" 
       android:clipToPadding="false" 
       android:clipChildren="false" 
    > 
    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_centerVertical="true" 
     android:id="@+id/delete_button" 
     android:onClick="deleteRecordWithId" 
     app:srcCompat="@drawable/remove_icon" 
     android:background="@drawable/background_transparent" 
     android:layout_gravity="center_vertical" 
     android:adjustViewBounds="false" 
     android:paddingStart="7dp" 
     android:paddingEnd="7dp" 
     android:layout_marginEnd="-5dp"/> 

</RelativeLayout> 

Zweite Methode: Sie sollten nicht getView in der Cursoradapter verwenden. Sie müssen alle Vorgänge in Bindview ausführen. So können Sie id mit getview nicht erreichen.

Zum Beispiel: https://github.com/rodoggx/w4d1_Simple_CursorAdapter/blob/master/app/src/main/java/com/example/sqlitecursoradapter/CustomAdapter.java

+0

ok. Aber wie ich werde die Position von dieser Taste verwenden, die geklickt wird, ohne getView() – Suraj

+0

ich denke, das löst Ihr Problem. https://stackoverflow.com/questions/27666203/get-a- position-in-bindview-using-cursoradapter oder https://stackoverflow.com/questions/28207830/custom-cursor-adapter-get-position –

+0

dieser code funktioniert, ist aber nicht korrekt.danke, dass ihr mir geholfen habt Das große Bild zu verstehen, aber die Sache ist, wenn ich Position innerhalb onclick verwende, sagt es mir, es endgültig zu erklären, wenn ich es endgültig mache, wird der Wert davon nie geändert werden – Suraj

0

gesetzt setOnItemClickListener auf Ihre Listenansicht ...

yourListView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 
      yourListView.remove(position); 
      database.removeItem(id);//create removemethod in database class 

     } 
    }); 

definieren removeItem Methode

public void remove(long id){ 
     String str =String.valueOf(id); 
     database.execSQL("DELETE FROM <TABLE_NAME> WHERE _id = '" + str + "'"); 
    } 
+0

Ja, ich erkläre, dass von wo die Werte zu denen kommen, auf denen Sie nullpointer Ausnahme erhalten – Suraj

+0

Vielen Dank für den obigen Code, aber es hat keine Schaltfläche. Ich muss versuchen, mit einer Schaltfläche – Suraj

+0

Sie suchen [this] (https://stackoverflow.com/questions/7831395/android-how-to-delete-a-row-from-a-listview-with-a -Lösche-Button-in-the-row) -Lösung. Bitte einmal prüfen. – androidOnHigh

0

diese ersetzen:

help.deleteRecordWithId(position); 

mit:

CustomAdapter.this.remove(CustomAdapter.this.getItem(position)); 
CustomAdapter.this.notifyDataSetChanged(); 

Es wird Daten von Ihrem Adapter löschen und notifydatasetchanged wird entsprechend Ihrem Listview aktualisieren.

+0

Es wird sicherlich funktionieren, wenn andere als der verbleibende Code funktioniert. Lassen Sie es mich wissen, wenn es funktioniert und für weitere Unterstützung, falls erforderlich. Vergessen Sie nicht, dies als Antwort zu markieren, wenn es für Sie funktioniert. Happy Coding Bro :) –

+0

kann nicht auflösen "entfernen" – Suraj

+0

10 entfernen ist Methode zu löschen von ArrayAdapter Sie verwenden cursorAdapter für das deleteRecordwithId wird den Job, versuchen Sie es –

0

ListView bietet keine direkte Möglichkeit, Aktionen für Ansichten in einem Element zu implementieren. Verwenden Sie stattdessen RecyclerView, es ist anpassbarer und leistungsfähiger als die Listenansicht.

Create Lists and Cards - Android Developer

Verwandte Themen