Tengo un edittext campo y un botón «buscar». Cuando hago clic en buscar, tengo que muestra una vista de lista con los datos correspondientes a los valores introducidos en el edittext. He añadido un encabezado a mi lista utilizando addHeader(). Cuando busco un primer momento, soy capaz de mostrar los datos en la Lista con éxito. Pero cuando hago la búsqueda de nuevo, estoy recibiendo el siguiente error.

FATAL EXCEPTION: main
java.lang.IllegalStateException: Cannot add header view to list -- setAdapter has already been called.
at android.widget.ListView.addHeaderView(ListView.java:261)
at android.widget.ListView.addHeaderView(ListView.java:284)

He asignado a la cabecera de mi lista antes de configurar el adaptador.

A continuación es mi código:

myList = (ListView) findViewById(R.id.searchResultsList);
View header = View.inflate(this, R.layout.search_results_header, null);
myList.addHeaderView(header, null, false);

dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.setAdapter(dataAdapter);

Donde estoy haciendo mal?

InformationsquelleAutor user2740599 | 2013-10-25

10 Comentarios

  1. 25

    Android 2.3, agregar encabezado después de setAdapter (incluso si se han añadido al principio, luego se retira), se produce una excepción. Para ocultar o mostrar un encabezado de forma dinámica, utilice setVisibility(). Cómo? Usted puede ver Ocultar encabezado vistas.

    • Se trabajó. Me salvó el día!
  2. 12

    Puede agregar encabezado de la vista de lista — setAdapter ya ha sido llamado.
    que usted puede ver, la milista.addHeaderView(encabezado) se debe ejecutar antes de
    milista.setAdapter(adaptador);

    • He puesto en la cabecera de mi Lista antes de configurar el adaptador a la lista.
    • Tenga en cuenta que en 4.4.4 funciona la adición de antes. He tenido este error de la prueba en los dispositivos más antiguos
    • thnx GuilhE ….
  3. 1

    Probar esta..

    dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
    myList.addHeaderView(header);
    myList.setAdapter(dataAdapter);
    dataAdapter.notifyDataSetChanged();
    • ¿por qué este adapter.notifyDataSetChanged() la actualización de un lsitview?
    • inicialmente dataAdapter está vacía después de entrar en edittext que necesita para añadir la vista, por lo que necesitan para actualizarlo.
    • creo que no necesita adapter.notifyDataSetChanged(). developer.android.com/reference/android/widget/…
    • Después de agregar el adaptador.notifyDataSetChanged() también estoy obteniendo el mismo error 🙁
    • Cualquier otra solución para este problema
  4. 1

    puede agregar FrameLayout como encabezado de la vista antes de configuración de adaptador y dinámicamente añadir/quitar de la vista en FrameLaypout

  5. 1

    Tuve el mismo problema hoy en día. Tengo varias ListViews.. Con la información de la primera, se construye la lista de la siguiente y todo el mundo tiene setAdapter en ella.
    Para mí, la mejor solución era poner

    setListAdapter(null);

    en la parte superior de la función, donde me infle el Encabezado. Espero que esta ayuda..

  6. 1

    Si se utiliza android:entries en la vista de lista en el archivo xml, Su llamado setAdapter() método antes de addHeaderView. Por lo tanto, eliminar android:entriesatributo de ListView en el fichero xml de diseño. Va a ser un trabajo.

  7. 0

    Después me puse

    final ViewGroup header = (ViewGroup) inflater.inflate(R.layout.item, listView, false);
    listView.addHeaderView(header, null, true); 

    antes de

    listView.setAdapter(adapter);

    un problema apareció. Luego me hizo Construir > Limpieza del Proyecto.

  8. -1

    Después de tanto esfuerzos conseguí solución para mi lado
    espero que esto le ayude a alguien demasiado

    ya he conjunto del adaptador en el último (después de la vista de agregado), pero no sé por qué yo estaba suffring desde el mismo error, así que aquí me hizo algo como esto código

    //Set View here
    View view = getLayoutInflater().inflate(R.layout.navigation_header,null);
    mDrawerList.addHeaderView(view);
    //init your adapter
    adapter1 = new YourListAdapter(getApplicationContext(),blabla);
    //set adapter into handler
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {        
       @Override
      public void run() {
      //TODO Auto-generated method stub
      mDrawerList.setAdapter(adapter1);
      }
    }, 100);

    Pongo mi adaptador para controlador en algún momento de happends que juego de adaptador rápido que la vista por lo que este código lo suficiente para mí, para resolver esta excepción. 🙂

  9. -2

    He usado el siguiente código en mi aplicación de ejemplo para establecer un control ListView encabezado:

    ListView lv = getListView();
    View headerView = getLayoutInflater().inflate(R.layout.layout_header, null, false);
    lv.addHeaderView(headerView);
    final TumblrDB db = new TumblrDB(this);
    c = db.query();
    startManagingCursor(c);
    adapter = new CustomCursorAdapter(this, R.layout.layout_del, c, new String[]{TumblrDB.DATE, TumblrDB.DESC}, new int[]{R.id.txt_a, R.id.txt_b});
    lv.setAdapter(adapter);

Dejar respuesta

Please enter your comment!
Please enter your name here