2010-04-01 45 views
52

¿Puede alguien darme un código de ejemplo para eliminar todos los elementos de ListView y reemplazarlos con elementos nuevos?Eliminar elementos de ListView en Android

He intentado reemplazar los elementos del adaptador sin éxito. Mi código es

populateList(){ 

results //populated arraylist with strings 

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, results); 

listview.setAdapter(adapter); 
adapter.notifyDataSetChanged(); 
listview.setOnItemClickListener(this); 

} 

// now populating list again 

repopulateList(){ 

results1 //populated arraylist with strings 

ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, results1); 

listview.setAdapter(adapter1); 
adapter1.notifyDataSetChanged(); 
listview.setOnItemClickListener(this); 
} 

Aquí repopulateList() método se sumará a elementos de ListView, pero no elimina/reemplazar todos los elementos de ListView.

Respuesta

20

Puede utilizar

adapter.clear() 

que eliminará todo el artículo de su primer adaptador entonces se podría alguno de los conjuntos otro adaptador o volver a usar el adaptador y agregar los elementos a la vieja adaptador. Si utiliza

adapter.add() 

para agregar datos a su lista que no es necesario llamar a notifyDataSetChanged

+5

No hay ninguna norma() para mi CustomAdapter que se extiende desde BaseAdapter! –

20

Creo que si u añadir el siguiente código, que funcionará

listview.invalidateViews(); 

Para eliminar una elemento, simplemente elimine ese elemento de la lista de arrays que pasamos al adaptador y haga listview.invalidateViews();
Esto actualizará la vista de lista

+0

Esto funciona genial para mí, gracias! – bodruk

+0

¡Este código funciona perfectamente! – Razor

+0

listview.invalidate() funcionó para mí. –

4
  names = db.getSites(); 
      la = new ArrayAdapter<String>(EditSiteList.this, 
        android.R.layout.simple_list_item_1, names); 
      EditSiteList.this.setListAdapter(la); 
      listview.invalidateViews(); 

este código funciona bien para mí.

64

Usted tendrá que remove() el artículo de su objeto adaptador y luego simplemente ejecutar el notifyDatasetChanged() en el adaptador, cualquier ListView s serán (deben) reciclar y actualizar por sí mismo.

He aquí un breve ejemplo con la actividad AlertDialog s:

adapter = new MyListAdapter(this); 
    lv = (ListView) findViewById(android.R.id.list); 
    lv.setAdapter(adapter); 
    lv.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> a, View v, int position, long id) { 
     AlertDialog.Builder adb=new AlertDialog.Builder(MyActivity.this); 
     adb.setTitle("Delete?"); 
     adb.setMessage("Are you sure you want to delete " + position); 
     final int positionToRemove = position; 
     adb.setNegativeButton("Cancel", null); 
     adb.setPositiveButton("Ok", new AlertDialog.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       MyDataObject.remove(positionToRemove); 
       adapter.notifyDataSetChanged(); 
      }}); 
     adb.show(); 
     } 
    }); 
+30

¿cuál es tu MyDataObject? – draw

+7

MyDataObject sería lo que sea su última tienda de respaldo. La mayoría de las veces, no solo desea eliminar elementos de la VISUALIZACIÓN, también quiere eliminarlos de alguna base de datos, o de algún servidor, o de algún almacenamiento de archivos. Esharp acaba de dejar un recordatorio de que debe recordar borrar realmente los datos, además de eliminarlos de la pantalla. – Nate

9

de retirarla del adaptador y luego notificar a la ArrayAdapter ese conjunto de datos ha cambiado.

m_adapter.remove(o); 
m_adapter.notifyDataSetChanged(); 
14
int count = adapter.getCount(); 
for (int i = 0; i < count; i++) { 
adapter.remove(adapter.getItem(i)); 
} 

luego llamar a notifyDataSetChanged();

+7

Debe ser 'adapter.remove (adapter.getItem (0));'? – Ishtar

+0

'adapter.remove (adapter.getItem (0));' esto solo eliminará el primer elemento, pero si desea eliminarlos todos, vaya por lo que he publicado. – Rex

+4

El comentario de Ishtar es correcto. El código anterior intentará eliminar elementos más allá del final de la lista. Cada iteración a través de la lista elimina un elemento, por lo que cuando yo sea igual a (recuento - 1), tendrá una lista de un elemento y getItem (i) fallará. –

4
  • usted debe utilizar sólo un adaptador binded con la lista de datos que necesita para enumerar
  • Cuando tenga que quitar y reemplazar todos los artículos, usted tiene borrar todos los elementos de la lista de datos usando "list.clear()" y luego agregar nuevos datos usando "list.addAll (List)"

aquí un ejemplo:

List<String> myList = new ArrayList<String>(); 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,  android.R.layout.simple_list_item_1, myList); 
listview.setAdapter(adapter); 
listview.setOnItemClickListener(this); 

populateList(){ 
    List<String> result = getDataMethods(); 

    myList.addAll(result); 
    adapter.notifyDataSetChanged(); 
} 

repopulateList(){ 
    List<String> result = getDataMethods(); 

    myList.clear(); 
    myList.addAll(result); 
    adapter.notifyDataSetChanged(); 
} 
1

Al principio debe eliminar el elemento de su lista. Más tarde puede vaciar su adaptador y rellenarlo con una nueva lista.

private void add(final List<Track> trackList) { 
    MyAdapter bindingData = new MyAdapter(MyActivity.this, trackList); 

    list = (ListView) findViewById(R.id.my_list); // TODO 

    list.setAdapter(bindingData); 


    // Click event for single list row 
    list.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> parent, View view, 
       final int position, long id) { 
      // ShowPlacePref(places, position); 
      AlertDialog.Builder showPlace = new AlertDialog.Builder(
        Favoriler.this); 
      showPlace.setMessage("Remove from list?"); 
      showPlace.setPositiveButton("DELETE", new OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) {  

        trackList.remove(position); //FIRST OF ALL REMOVE ITEM FROM LIST 
        list.setAdapter(null); // THEN EMPTY YOUR ADAPTER 

        add(trackList); // AT LAST REFILL YOUR LISTVIEW (Recursively) 

       } 

      }); 
      showPlace.setNegativeButton("CANCEL", new OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 

       } 
      }); 
      showPlace.show(); 
     } 

    }); 

} 
1

Es simple.En primer lugar debe limpiar su colección y después de lista clara como este código:

yourCollection.clear(); 
setListAdapter(null); 
1

Usted puede utilizar

lv.setAdapter(null); 
2

probar este código, que funciona para mí.

public class Third extends ListActivity { 
private ArrayAdapter<String> adapter; 
private List<String> liste; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_third); 
    String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
       "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
       "Linux", "OS/2" }; 
    liste = new ArrayList<String>(); 
    Collections.addAll(liste, values); 
    adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, liste); 
    setListAdapter(adapter); 
} 
@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
    liste.remove(position); 
    adapter.notifyDataSetChanged(); 
    } 
} 
Cuestiones relacionadas