5

Używam ListAdapter zapełnić ListView takiego:Jak zresetować ListView z ArrayAdapter po pobierania danych

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

a potem Robię zdalnego połączenia do mojego serwera, aby uzyskać więcej danych na tej listy z wywołaniem AsyncTask, a kiedy otrzymam dane z powrotem z serwera, nie wiem jak zapełnić i zresetować ListView. Do tej pory mam coś takiego:

@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? 
       } 

mogę zrobić wynik w dane odpowiednio skonstruowane, aby zresetować listę, ale nie wiem, jak to jest zrobione. Czy ktoś może Ci pomóc? :)

Odpowiedz

16

używam to w ten sposób,

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

następnie

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

wtedy zawartość ListView zmieni w momencie wykonywania tej funkcji

+0

Pozwól mi spróbować teraz ... Powiem ci jak poszło :) – GeekedOut

+0

ah ok, to kompilacja! Dzięki! – GeekedOut

+0

Nie ma problemu, powodzenia –

3
adapter.notifyDataSetChanged(); 

jest dobrym rozwiązaniem Aby to zrobić, ale czasami to nie zadziała, jak potrzebujemy. W takim przypadku możesz ponownie ustawić adapter, a widok listy zostanie odświeżony. Ale nie jest to dobrą opcją, ponieważ powoduje ponowne generowanie całego listview, co znacznie obniża wydajność. Twoja aplikacja działa wolno.

7

Nie ma potrzeby reinicjowania adaptera, jeśli po prostu chcesz zmienić zestaw danych. Wypróbuj poniższy kod -

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

po tym, jeśli jest to wymagane, możesz również powiadomić o zmianie adaptera, chociaż nie powinno to być konieczne.

adapter.notifyDataSetChanged(); 

jeśli celujesz na poziomie interfejsu API 11 lub nowszym, możesz użyć metody addAll() na adapterze. Ponieważ jest bardziej wydajny.