Me enfrento a un problema muy común: diseñé una actividad y ahora resulta que debería mostrar algunos elementos dentro de ella ScrollView
. La forma normal de hacerlo sería usar el existente ListAdapter
, conectarlo a ListView
y BOOM tendría mi lista de elementos.
PERO no debe colocar un anidado ListView
en un ScrollView
ya que arruina el desplazamiento, incluso Android Lint se queja de ello.
Entonces esta es mi pregunta:
¿Cómo conecto un ListAdapter
a un LinearLayout
o algo similar?
Sé que esta solución no se escalará para muchos elementos, pero mis listas son muy cortas (<10 elementos), por lo que no es necesario reutilizar las vistas. En cuanto al rendimiento, puedo vivir colocando todas las vistas directamente en el archivo LinearLayout
.
Una solución que se me ocurrió sería colocar mi diseño de actividad existente en la sección headerView del archivo ListView
. Pero se siente como abusar de este mecanismo, así que estoy buscando una solución más limpia.
Ideas?
ACTUALIZACIÓN: Para inspirar la dirección correcta, agrego un diseño de muestra para mostrar mi problema:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/news_detail_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:visibility="visible">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="@dimen/news_detail_layout_side_padding"
android:paddingRight="@dimen/news_detail_layout_side_padding"
android:paddingTop="@dimen/news_detail_layout_vertical_padding"
android:paddingBottom="@dimen/news_detail_layout_vertical_padding"
>
<TextView
android:id="@+id/news_detail_date"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="LALALA"
android:textSize="@dimen/news_detail_date_height"
android:textColor="@color/font_black"
/>
<Gallery
android:id="@+id/news_detail_image"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:paddingTop="5dip"
android:paddingBottom="5dip"
/>
<TextView
android:id="@+id/news_detail_headline"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:text="Some awesome headline"
android:textSize="@dimen/news_detail_headline_height"
android:textColor="@color/font_black"
android:paddingTop="@dimen/news_detail_headline_paddingTop"
android:paddingBottom="@dimen/news_detail_headline_paddingBottom"
/>
<TextView
android:id="@+id/news_detail_content"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Here comes a lot of text so the scrollview is really needed."
android:textSize="@dimen/news_detail_content_height"
android:textColor="@color/font_black"
/>
<!---
HERE I NEED THE LIST OF ITEMS PROVIDED BY THE EXISTING ADAPTER.
They should be positioned at the end of the content, so making the scrollview smaller is not an option.
---->
</LinearLayout>
</ScrollView>
</LinearLayout>
ACTUALIZACIÓN 2 Cambié el título para que sea más fácil de entender (obtuve un voto negativo, ¡doh!).
fuente
Respuestas:
Probablemente debería agregar manualmente sus elementos a
LinearLayout
:EDITAR : Rechacé este enfoque cuando necesitaba mostrar alrededor de 200 elementos de lista no triviales, es muy lento - Nexus 4 necesitó alrededor de 2 segundos para mostrar mi "lista", eso era inaceptable. Así que recurrí al enfoque de Flo con encabezados. Funciona mucho más rápido porque las vistas de lista se crean a pedido cuando el usuario se desplaza, no en el momento en que se crea la vista.
Reanudar: La adición manual de vistas al diseño es más fácil de codificar (por lo tanto, potencialmente menos partes móviles y errores), pero tiene problemas de rendimiento, por lo que si tiene como 50 vistas o más, le recomiendo usar el enfoque de encabezado.
Ejemplo. Básicamente, el diseño de la actividad (o fragmento) se transforma en algo como esto (ya no se necesita ScrollView):
Luego, en
onCreateView()
(usaré un ejemplo con un fragmento), debe agregar una vista de encabezado y luego configurar un adaptador (supongo que el ID del recurso del encabezado esheader_layout
):fuente
ListAdapter
yListView
hace más magia detrás de las pantallas que luego no hago manualmente.notifyDataSetChanged
método del adaptador ? Esto funciona bien en un adaptador diferente que he conectado aListView
, pero no parece funcionar con el que he conectado aLinearLayout
.Me quedaría con la solución de vista de encabezado. No tiene nada de malo. En este momento estoy implementando una actividad usando exactamente el mismo enfoque.
Obviamente, la "parte del elemento" es más dinámica que estática (variando el recuento de elementos frente al recuento de elementos arreglados, etc.); de lo contrario, no pensará en usar un adaptador en absoluto. Entonces, cuando necesite un adaptador, use ListView.
Implementar una solución que rellene un LinearLayout desde un adaptador no es nada más que construir un ListView con un diseño personalizado.
Solo mis 2 centavos.
fuente
ListView
. No estoy seguro de que me guste este parche.Establezca su vista en main.xml onCreate, luego infle desde row.xml
main.xml
row.xml
fuente
Utilizo el siguiente código que replica la funcionalidad del adaptador con
ViewGroup
yTabLayout
. Lo bueno de esto es que si cambia su lista y vuelve a vincular, solo afectará a los elementos modificados:Uso:
Para
ViewGroups
:Porque
TabLayout
tengo esto:fuente