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

¿Fue útil?

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();
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top