2017-03-05 2 views
0

Ich bin ein Anfänger Android Entwickler und arbeitete an der Erstellung einer grundlegenden To-Do-Liste App. Die App enthält eine benutzerdefinierte Listenansicht mit einem farbigen Kreis zum Anzeigen der Priorität, dem Titel und einem Kontrollkästchen zum Überprüfen und Löschen des Elements, wenn der Benutzer es getan hat. Die App speichert diese Aufgaben mithilfe der SQLite-Datenbank und verwendet Loader zum Abrufen von Daten.android: Wie lösche ich ein ListView-Objekt mit Checkbox?

Was ich versuche ist, das Element aus der Liste zu löschen, sobald das Kontrollkästchen aktiviert ist.

Ich habe versucht, Löschen Aufgabe in der Adapter-Klasse wie folgt (auch versucht zu animieren Löschen.) Zu implementieren:

CheckBox itemCheck = (CheckBox)view.findViewById(R.id.todo_checked); 
    itemCheck.setChecked(false); 
    itemCheck.setTag(priority); 
    itemCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if(isChecked){ 
       int idIndex = cursor.getColumnIndex(TodoTable.ID); 
       final int id = cursor.getInt(idIndex); 
       final Uri uriTodDelete = ContentUris.withAppendedId(TodoTable.TABLE_URI,id); 
       Animation slideOut = AnimationUtils.loadAnimation(context,android.R.anim.slide_out_right); 
       slideOut.setAnimationListener(new Animation.AnimationListener() { 
        @Override 
        public void onAnimationStart(Animation animation) { 

        } 

        @Override 
        public void onAnimationEnd(Animation animation) { 
         context.getContentResolver().delete(uriTodDelete,null,null); 


        } 

        @Override 
        public void onAnimationRepeat(Animation animation) { 

        } 
       }); 
       view.startAnimation(slideOut); 

Das Problem ist, wenn ich löschen Sie das oberste Element der Listenansicht, die Position direkt unter Es wird gelöscht. Aber es funktioniert gut, wenn ich von unten lösche.

Wie behebe ich das? Jede Hilfe wird geschätzt.

P. Die Delete-Methode der Content Resolver-Klasse behandelt die notifyDataSetChanged() -Methode.

+0

Bitte geben Sie Ihren Adaptercode an, damit andere das Problem diagnostizieren können. –

Antwort

0

Eine wilde Vermutung, sind Sie nicht den Cursor auf die entsprechende Zeile bewegt so Cursor auf pos x ist, aber Sie klicken können -on listview- zum Produkt an Pos y.

so müssen Sie den Cursor an die relevante Position bewegen, bevor Sie versuchen, den ID-Wert zu erhalten.

Ich nehme an, Sie tun diesen Code in getView()? wie Sie einen Adapter verwenden.

Sie müssen wie unter Verwendung von Positionsparameter übergeben in getView() machen:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    : 
    : 
    if(isChecked){ 
     cursor.moveToPosition(position); 
     int idIndex = cursor.getColumnIndex(TodoTable.ID); 
     final int id = cursor.getInt(idIndex); 
     : 
     : 
    } 

    : 
    : 
} 

Sie müssen auch der Cursor stellen Sie sicher, wird re query sonst können Sie einige Probleme mit Positionen erhalten, sobald Sie Artikel aus der Liste entfernen - Ich denke, das wird automatisch behandelt, wenn Sie eine cursor adapter verwenden? überprüfen Sie das einfach.