tutorial studio activity java android listview android-asynctask

java - studio - Async y ListView Android



listview android studio (3)

BackgorundTask.java ( ¿Cómo obtener el resultado de OnPostExecute () a la actividad principal porque AsyncTask es una clase separada? )

public class BackgroundTask extends AsyncTask<String,Void,String> { public interface AsyncResponse { void processFinish(String output); } public AsyncResponse delegate = null; public BackgorundTask(AsyncResponse delegate){ this.delegate = delegate; } protected String doInBackground(String... uri) { HttpClient httpclient = new DefaultHttpClient(); HttpResponse response; String responseString = null; try { response = httpclient.execute(new HttpGet(uri[0])); StatusLine statusLine = response.getStatusLine(); if(statusLine.getStatusCode() == HttpStatus.SC_OK){ ByteArrayOutputStream out = new ByteArrayOutputStream(); response.getEntity().writeTo(out); responseString = out.toString(); out.close(); } else{ //Closes the connection. response.getEntity().getContent().close(); throw new IOException(statusLine.getReasonPhrase()); } } catch (ClientProtocolException e) { //TODO Handle problems.. } catch (IOException e) { //TODO Handle problems.. } return responseString; } protected void onProgressUpdate(Integer... progress) { } @Override protected void onPostExecute(String result) { delegate.processFinish(result); } }

ListActivity.java

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); BackgorundTask asyncTask = (BackgorundTask) new BackgorundTask(new BackgorundTask.AsyncResponse(){ @Override public void processFinish(String output){ listAdapter.add(output); } }).execute("some url"); adapter = new MyCustomAdapter(listAdapter, this); final ListView mainListView = (ListView)findViewById(R.id.listView); mainListView.setAdapter(adapter);

La variable se devuelve correctamente Pero no puedo agregar a ListView (listAdapter) de cada elemento. ¿Cuál podría ser la razón? Supongo que tengo que extraer de alguna manera la salida de variable de cadena de asyncTask a mi función onCreate en la que se coloca.


Debe volver a configurar el adaptador cuando reciba una cadena de salida de la siguiente manera:

BackgorundTask asyncTask = (BackgorundTask) new BackgorundTask(new BackgorundTask.AsyncResponse(){ @Override public void processFinish(String output){ listAdapter.add(output); adapter = new MyCustomAdapter(listAdapter, this); final ListView mainListView = (ListView)findViewById(R.id.listView); mainListView.setAdapter(adapter); } }).execute("some url");


El código para devolver los datos a la actividad y a su adaptador de lista me parece bien. Creo que solo necesita agregar una listAdapter.notifyDataSetChanged(); después de listAdapter.add(output); así que la lista de la lista sabe que tiene que renderizarse de nuevo.


tu código esta bien. solo necesita llamar a esta línea después de agregar datos

listAdapter.add(output); // after this line add below line listAdapter.notifyDataSetChanged();