android - recyclerview - No se puede agregar la vista de encabezado a la lista-setAdapter ya se ha llamado
listview dinamico android studio (9)
Tengo un campo de texto de edición y un botón de "búsqueda". Cuando hago clic en buscar, tengo que mostrar una vista de lista con datos correspondientes a los valores ingresados en el texto de edición. He agregado un encabezado a mi lista usando addHeader (). Cuando busco por primera vez, puedo mostrar datos en la lista con éxito. Pero cuando vuelvo a buscar, obtengo 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 un encabezado a mi lista antes de configurar el adaptador.
A continuación está 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?
No se puede agregar la vista de encabezado a la lista: ya se ha llamado a setAdapter. que puede ver, el myList.addHeaderView (encabezado) debe ejecutarse antes de myList.setAdapter (adaptador);
Prueba esto..
dataAdapter = new MyCustomAdapter(this, R.layout.results_list_item, searchedResults);
myList.addHeaderView(header);
myList.setAdapter(dataAdapter);
dataAdapter.notifyDataSetChanged();
En Android 2.3, agregue el encabezado después de setAdapter (incluso si ha agregado antes, luego quitado) arrojará una excepción. Para ocultar o mostrar un encabezado dinámicamente, use setVisibility (). ¿Cómo? Puede ver Ocultar vistas de encabezado .
puede agregar FrameLayout como vista de encabezado antes de configurar el adaptador y agregar / eliminar dinámicamente la vista en FrameLaypout
Tuve el mismo problema hoy. Tengo varias ListViews. Con la información de la primera, crea la lista de la siguiente y todos han establecido Adaptador en ella. Para mí, la mejor solución fue poner
setListAdapter(null);
en la parte superior de la función, donde inflico el encabezado. Espero que esto ayude..
Si se utilizó android:entries
en ListView en el archivo xml, se llama método setAdapter()
antes de agregarHeaderView. Por lo tanto, elimine el atributo android:entries
de ListView en el archivo de diseño xml. Será trabajo.
Después de tantos esfuerzos obtuve una solución para mi lado, espero que esto ayude a alguien también
ya configuré el adpater (después de la vista agregada) pero no sé por qué estaba sufriendo el mismo error, así que aquí hice algo como este 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);
Puse mi adaptador en el manejador en algún momento en que el adaptador se configura más rápido que el código de vista para que yo pueda resolver esta excepción. :)
Después de establecer
final ViewGroup header = (ViewGroup) inflater.inflate(R.layout.item, listView, false);
listView.addHeaderView(header, null, true);
antes de
listView.setAdapter(adapter);
un problema aún apareció. Luego hice Build> Clean Project.
He utilizado el siguiente código en mi aplicación de muestra para establecer un encabezado ListView:
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);