Android - Adición y mostrando elementos a ListView uno a la vez utilizando un ArrayAdapter
-
22-09-2019 - |
Pregunta
Estoy usando un ArrayAdapter para añadir elementos a un ListView y personalizada que muestra los resultados en mi aplicación Android. El problema que estoy teniendo es que el ArrayAdapter parece que esperar hasta que todos los artículos están en él antes de que aparezca la vista. Es decir, cuando estoy añadiendo los artículos a la ArrayAdapter y hago un llamamiento notifyDataSetChanged, que no actualiza el ListView para mostrar el elemento añadido. Espera hasta que se añaden todos los artículos y GetView se llama antes de mostrar los artículos.
Lo que me gustaría que haga es mostrar el artículo inmediatamente después de añadir a la ListView. ¿Es esto posible?
Creo que el código en cuestión es la siguiente:
r_adapter = new ReminderAdapater(Activity_ContentSearch.this, R.layout.search_listitem, myList);
listView.setAdapter(r_adapter);
...
r_adapter.notifyDataSetChanged();
r_adapter.clear();
for(int i = 0; i < myList.size(); i++)
{
r_adapter.add(myList.get(i));
r_adapter.notifyDataSetChanged();
}
Como se puede ver, a pesar de que estoy llamando notifyDataSetChanged después de que el método add, que en realidad no se actualiza la vista. Después de que haya terminado el bucle por encima de la vista se actualiza por último (en base a lo que sé, eso es porque GetView no se conoce hasta después de realizada esta sección del código).
He intentado reemplazar el método Add de mi ArrayAdapter encargo sin suerte, ya que no tengo acceso a la vista en ese método.
Cualquier ayuda sería bienvenida:)
Bara
Solución
interfaz de usuario de Android es de un solo subproceso. Usted no está dando de nuevo el control a Android desde el hilo principal de la aplicación cada vez que se agrega una entrada al adaptador. Por lo tanto, Android no tienen la oportunidad de mostrar sus entradas hasta que regrese el control, y usted no está haciendo eso hasta que haya rellenado su adaptador en su totalidad.
Aquí se presenta una ejemplo que muestra el uso de una AsyncTask
para llenar un ArrayAdapter
progresivamente a través de un hilo de fondo.
/***
Copyright (c) 2008-2012 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
From _The Busy Coder's Guide to Android Development_
http://commonsware.com/Android
*/
package com.commonsware.android.async;
import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import java.util.ArrayList;
public class AsyncDemo extends ListActivity {
private static final String[] items={"lorem", "ipsum", "dolor",
"sit", "amet", "consectetuer",
"adipiscing", "elit", "morbi",
"vel", "ligula", "vitae",
"arcu", "aliquet", "mollis",
"etiam", "vel", "erat",
"placerat", "ante",
"porttitor", "sodales",
"pellentesque", "augue",
"purus"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
new ArrayList<String>()));
new AddStringTask().execute();
}
class AddStringTask extends AsyncTask<Void, String, Void> {
@Override
protected Void doInBackground(Void... unused) {
for (String item : items) {
publishProgress(item);
SystemClock.sleep(200);
}
return(null);
}
@SuppressWarnings("unchecked")
@Override
protected void onProgressUpdate(String... item) {
((ArrayAdapter<String>)getListAdapter()).add(item[0]);
}
@Override
protected void onPostExecute(Void unused) {
Toast
.makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT)
.show();
}
}
}