5

Estoy utilizando un ListAdapter para rellenar un ListView así:Cómo restablecer el ListView con el ArrayAdapter después de ir a buscar los datos

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

y después de que yo estoy haciendo una llamada remota a mi servidor para obtener más datos para esa lista con una llamada AsyncTask, y cuando recupero los datos del servidor no sé cómo llenar y restablecer el ListView. Hasta ahora tengo algo como esto:

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

que puede hacer que el resultado en datos estructurados apropiadamente para restablecer la lista, pero no está seguro de cómo se hace. ¿Puede ayudarme alguien, por favor? :)

Respuesta

16

utilizo esta manera,

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

continuación

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

entonces el contenido de vista de lista va a cambiar en el momento de ejecutar esta función

+0

Déjame intentarlo ahora ... Te diré cómo fue :) – GeekedOut

+0

¡vale, está compilando! ¡Gracias! – GeekedOut

+0

No hay problema, buena suerte –

3
adapter.notifyDataSetChanged(); 

es buena opción para hacer esto, pero a veces eso no funcionará como lo necesitamos. En ese caso, puede setadapter nuevamente y su vista de lista se actualizará. Pero esta no es una buena opción para hacer porque vuelve a generar toda la lista de la lista, lo que provoca un rendimiento muy bajo. Y tu aplicación se vuelve lenta.

7

No necesita reiniciar el adaptador, si solo desea cambiar el conjunto de datos. Pruebe el siguiente código -

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

después de eso, si es necesario, se puede notificar el cambio al adaptador también, aunque no debería ser necesario.

adapter.notifyDataSetChanged(); 

Si apuntas al nivel de API 11 o superior, puedes usar el método addAll() en el adaptador. Dado que es más eficiente.

adapter.clear(); 
adapter.addAll(categoriesArray); 
Cuestiones relacionadas