2010-04-01 20 views
52

Qualcuno può darmi un esempio di codice per rimuovere tutti gli oggetti ListView e sostituirli con nuovi elementi?Rimuovi elementi ListView in Android

Ho provato a sostituire gli elementi dell'adattatore senza successo. Il mio codice è

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); 
} 

Qui repopulateList() metodo aggiungerà agli elementi ListView, ma non rimuove/sostituire tutti gli elementi ListView.

risposta

20

È possibile utilizzare

adapter.clear() 

che rimuoverà tutto l'oggetto del tuo primo adattatore allora si potrebbe o impostare un altro adattatore o riutilizzare l'adattatore e aggiungere gli elementi al vecchio adattatore. Se si utilizza

adapter.add() 

per aggiungere dati alla tua lista non è necessario chiamare notifyDataSetChanged

+5

Non c'è alcun chiaro() per il mio CustomAdapter che si estende da BaseAdapter! –

20

Penso che se u aggiungere il seguente codice, funzionerà

listview.invalidateViews(); 

Per rimuovere un articolo, basta rimuovere quell'elemento dall'arrayylist che abbiamo passato all'adattatore e fare listview.invalidateViews();
Questo aggiornerà la listview

+0

Questo funziona alla grande, grazie! – bodruk

+0

Questo codice funziona perfettamente! – Razor

+0

listview.invalidate() ha funzionato per me. –

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

questo codice funziona bene per me.

64

Si desidera remove() l'oggetto dall'oggetto adattatore e quindi basta eseguire il notifyDatasetChanged() sull'adattatore, qualsiasi ListView s (dovrebbe) riciclare e aggiornare su proprio.

Ecco un breve esempio di attività con 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

qual è il tuo MyDataObject? – draw

+7

MyDataObject sarebbe qualunque sia il tuo backing store finale. Nella maggior parte dei casi, non si desidera solo rimuovere gli elementi dall'esplorazione, ma anche rimuoverli da un database, da un server o da qualche archivio di file. Esharp stava lasciando un promemoria sul fatto che è necessario ricordare di cancellare davvero i dati, oltre a rimuoverli dal display. – Nate

9

rimuoverlo dalla scheda e quindi notificare l'arrayadapter che set di dati è cambiato.

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

quindi chiamare notifyDataSetChanged();

+7

Dovrebbe essere 'adapter.remove (adapter.getItem (0));'? – Ishtar

+0

'adapter.remove (adapter.getItem (0));' questo rimuoverà solo il primo elemento ma se vuoi rimuoverli tutti, allora vai per quello che ho postato .. – Rex

+4

Il commento di Ishtar è corretto. Il codice sopra tenterà di rimuovere gli elementi oltre la fine dell'elenco. Ogni iterazione attraverso l'elenco rimuove un elemento, quindi nel momento in cui i è uguale a (count - 1), si ha un elenco di un elemento e getItem (i) fallirà. –

4
  • si dovrebbe utilizzare una sola scheda rilegata con l'elenco dei dati necessari per elencare
  • Quando è necessario rimuovere e sostituire tutti gli elementi, si ha per cancellare tutti gli elementi dalla lista dati usando "list.clear()" e quindi aggiungere nuovi dati usando "lista.addTutti (Lista)"

qui un esempio:

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

All'inizio è necessario rimuovere l'elemento dall'elenco. Successivamente è possibile svuotare l'adattatore e riempirlo con una nuova 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

È semplice.In primo luogo si dovrebbe svuotare la raccolta e dopo elenco chiaro come questo codice:

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

È possibile utilizzare

lv.setAdapter(null); 
2

provare questo codice, funziona per me.

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(); 
    } 
} 
Problemi correlati