2016-07-07 15 views
0

Ich mache eine ToDo-Liste und habe Probleme beim Löschen eines Elements aus ListView.Android Studio, ListView-Objekt entfernen, ohne ein anderes Element zu beeinträchtigen

Wenn der Benutzer eine Sache auf seiner Liste getan hat, kann er auf das Element klicken und es wird entweder durchgestrichen sein, oder der Streik wird trhough rückgängig gemacht werden:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      TextView tv = (TextView) view; 
      int i_strikethrough = tv.getPaintFlags(); 
      if(i_strikethrough == 1297){ 
       tv.setPaintFlags(tv.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG)); 
      } else if (i_strikethrough == 1281){ 
       tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
      } 
     } 
    }); 

Wenn der Benutzer eine lange macht klicken, öffnet sich eine Meldung, und er kann wählen, diesen Inhalt löschen:

lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){ 
     @Override 
     public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 
      AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context); 
      alertDialogBuilder.setTitle("Delete"); 
      alertDialogBuilder.setMessage("Are you sure you want to delete?"); 
      alertDialogBuilder.setCancelable(false); 
      alertDialogBuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) 
       { 
        adapterInhalt.remove(adapterInhalt.getItem(position)); 
       } 
      }); 
      alertDialogBuilder.setNegativeButton("No", new DialogInterface.OnClickListener() 
      { 
       @Override 
       public void onClick(DialogInterface dialogInterface, int i) 
       { 
        dialogInterface.cancel(); 
       } 
      }); 
      AlertDialog alertDialog = alertDialogBuilder.create(); 
      alertDialog.show(); 

      return true; 
     } 
    }); 

Nun ist mein Problem folgendes:

der zweite Artikel Imagine wird durchgestrichen, aber die thi rd ist nicht.

Wenn ich das zweite Element lösche, dann ist das dritte Element an zweiter Stelle und wird durchgestrichen. Aber es sollte nicht durchgestrichen werden.

Ich hoffe, dass Sie mein Problem verstehen und dass Sie mir helfen können, dieses Problem zu lösen.

Ich hoffe, dieses Bild wird Ihnen helfen, das Problem zu verstehen: A helping Picture

+0

wir müssen uns Ihren vollständigen Adaptercode ansehen .. !! –

Antwort

0

Sie sind nicht eine Listenansicht richtig umzusetzen. Listenansichten recyceln Ansichten. Dies bedeutet, dass sie dieselben Ansichten wiederverwenden und unterschiedliche Positionen in Ihre Liste einfügen. Dies bietet sehr effizienten UI-Code. Dies bedeutet auch, dass Änderungen an der Ansicht außerhalb von getView Ihres Adapters dazu führen, dass diese Änderungen beim Entfernen oder Scrollen auf das falsche Element angewendet werden.

Der Schreibweise, um eine Listview zu machen ist, dass wenn Sie die Benutzeroberfläche jeder Position aktualisieren möchten, Sie das Modell dieser Position ändern. Dann sagen Sie dem Adapter, dass er aktualisiert werden muss, indem er notifyDataSetChanged() aufruft. Die getView-Funktion wird dann aufgerufen, um jedes sichtbare Element neu zu zeichnen und den Durchschlag anzuwenden.

0

Sie sollten eine Klasse für Ihre Artikel definieren, die ein boolesches Feld für den Streikstatus hat. zum Beispiel:

public class MyItem{ 
    String name; 
    boolean isStriked; 
} 

dann können Sie überprüfen, ob ein Element der durch auf Adapter getView() Methode striked wird. Sie können den Zusammenhalt in Ihrem Code auf diese Weise erhöhen. Übrigens empfehle ich RecyclerView zu verwenden, da es vordefinierte Methoden und Animationen zum Löschen von Artikeln hat

+0

Ich wusste nicht, dass es so etwas wie RecyclerView gibt. Vielen Dank. Ich werde einen Blick darauf haben. – DIvin93

Verwandte Themen