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