5

Sto utilizzando un ListAdapter per popolare un ListView come questo:Come reimpostare il ListView con l'ArrayAdapter dopo il recupero dei dati

static final String[] PROBLEMS = new String[] {"one", "two", "three" }; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState);   

    setListAdapter(new ArrayAdapter<String>(this, R.layout.my_problems, PROBLEMS)); 

    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

e dopo che sto facendo una chiamata remota al mio server per ottenere più dati per quella lista con una chiamata AsyncTask, e quando ottengo i dati dal server non so come popolare e ripristinare il ListView. Finora ho qualcosa di simile:

@Override 
    protected void onPostExecute(String result) 
    {  
      // Unwrap the stuff from the JSON string     
      String problem_title = null; 
      String problem_id = null; 

      try 
      { 
       JSONArray obj = new JSONArray(result); 
       JSONObject o = obj.getJSONObject(0);      

       Log.d("Title: " , "" + o.getString("problem_title"));  
       Log.d("id: " , "" + o.getString("problem_id"));  

       problem_title = o.getString("problem_title"); 
       problem_id = o.getString("problem_id"); 
      } 
      catch (Exception e) 
      { 
      } 

      // Now not sure what to do :) 
      // How do I reset the list that I had set up above? 
       } 

posso fare il risultato in dati strutturati in modo appropriato per reimpostare l'elenco, ma non sono sicuro di come questo è fatto. Qualcuno può aiutarmi per favore? :)

risposta

16

lo uso in questo modo,

values = new ArrayList<String>(); 
    //put anything you want in values as start 
    adapter = new ArrayAdapter<String>(this,R.layout.notification, values); 
    setListAdapter(adapter); 

poi

//change values array with your new data then update the adapter 
    adapter.notifyDataSetChanged(); 

allora il contenuto listview cambierà al momento si esegue questa funzione

+0

Lasciatemi provare ora ... ti dirò come è andata :) – GeekedOut

+0

ah ok, si sta compilando! Grazie! – GeekedOut

+0

Nessun problema, buona fortuna –

3
adapter.notifyDataSetChanged(); 

è buona opzione per fare questo, ma a volte non funzionerà come abbiamo bisogno. In tal caso, è possibile impostare nuovamente il setadapter e aggiornare la vista list. Ma questa non è una buona opzione da fare perché genera di nuovo l'intera listview, quindi questa performance è molto bassa. E la tua app rallenta.

7

Non è necessario reinizializzare l'adattatore, se si desidera solo modificare il set di dati. Provate il seguente codice -

adapter.clear(); 
for(int i = 0;i<categoriesArray.length;i++){ 
    adapter.add(categoriesArray[i]); 
} 

dopo che se necessario, è possibile notificare il cambiamento all'adattatore troppo, anche se non dovrebbe essere necessario.

adapter.notifyDataSetChanged(); 

se si sta utilizzando il livello API 11 o superiore, è possibile utilizzare il metodo addAll() sull'adattatore. Dal momento che è più efficiente.

adapter.clear(); 
adapter.addAll(categoriesArray); 
Problemi correlati