Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Utilizar un ListAdapter para rellenar un LinearLayout dentro de un diseño ScrollView

Estoy frente a un problema muy común: yo estableció una actividad y ahora resulta que debe mostrar algunos elementos dentro de este ScrollView . La forma normal de hacer eso sería usar el ListAdapter existente, conectarlo a ListView y BOOM tendría mi lista de elementos.

PERO No debe colocar un ListView anidado en un ScrollView ya que atornilla el desplazamiento – incluso Android Lint se queja de ello.

Así que aquí está mi pregunta:

¿Cómo conecto un ListAdapter a un LinearLayout o algo similar?

Sé que esta solución no escalará para muchos artículos pero mis listas son muy cortas (<10 artículos) así que el reusage de vistas no es realmente necesario. Rendimiento sabio que puedo vivir con la colocación de todas las vistas directamente en el LinearLayout .

Una solución que se me ocurrió sería colocar mi plan de actividad existente en la sección headerView de ListView . Pero esto parece 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> 

UPDATE 2 He cambiado el titular para que sea más fácil de entender (tiene un downvote, doh!).

  • La columna GridLayout va más allá de sus límites
  • ¿Cómo puedo alinear el menú / iconos de la barra de herramientas Android a la izquierda como en la aplicación de Google Maps?
  • ¿Cómo puedo guardar un mapa de bits con onRetainNonConfigurationInstance () para la orientación de la pantalla?
  • Animación Drawable causando OutOfMemoryError en segunda ejecución en Android
  • Diseño lineal y peso en Android
  • Colorear el widget Espacio
  • Enfoque de la petición EditText
  • Añadir acción de botón en la notificación personalizada
  • 3 Solutions collect form web for “Utilizar un ListAdapter para rellenar un LinearLayout dentro de un diseño ScrollView”

    Probablemente debería agregar manualmente sus artículos a LinearLayout :

     LinearLayout layout = ... // Your linear layout. ListAdapter adapter = ... // Your adapter. final int adapterCount = adapter.getCount(); for (int i = 0; i < adapterCount; i++) { View item = adapter.getView(i, null, null); layout.addView(item); } 

    EDIT : He rechazado este enfoque cuando necesitaba mostrar alrededor de 200 elementos de la lista no trivial, es muy lento – Nexus 4 necesitaba unos 2 segundos para mostrar mi "lista", que era inaceptable. Así que me volví hacia el enfoque de Flo con los encabezados. Funciona mucho más rápido porque las vistas de lista se crean a petición 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 sufre de problemas de rendimiento, por lo que si tiene como 50 vistas o más, aconsejo utilizar el enfoque de cabecera.

    Ejemplo. Básicamente, el diseño de la actividad (o fragmento) se transforma en algo como esto (ya no se necesita ScrollView):

     <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/my_top_layout" android:layout_width="fill_parent" android:layout_height="fill_parent"/> 

    A continuación, en onCreateView() (voy a usar un ejemplo con un fragmento) que necesita para agregar una vista de cabecera y, a continuación, establecer un adaptador (supongo que el encabezado de recursos ID es header_layout ):

     ListView listView = (ListView) inflater.inflate(R.layout.my_top_layout, container, false); View header = inflater.inflate(R.layout.header_layout, null); // Initialize your header here. listView.addHeaderView(header, null, false); BaseAdapter adapter = // ... Initialize your adapter. listView.setAdapter(adapter); // Just as a bonus - if you want to do something with your list items: view.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // You can just use listView instead of parent casted to ListView. if (position >= ((ListView) parent).getHeaderViewsCount()) { // Note the usage of getItemAtPosition() instead of adapter's getItem() because // the latter does not take into account the header (which has position 0). Object obj = parent.getItemAtPosition(position); // Do something with your object. } } }); 

    Me quedaría con la solución de vista de cabecera. No hay nada malo en ello. En este momento implemento una actividad utilizando exactamente el mismo enfoque.

    Obviamente, la "parte del artículo" es más dinámica que estática (variación del conteo de elementos frente al recuento de elementos fijos, etc.) de lo contrario no pensará en utilizar un adaptador en absoluto. Así que cuando necesite un adaptador, utilice ListView.

    La implementación de una solución que rellena un LinearLayout desde un adaptador es, al final, nada más que construir un ListView con un diseño personalizado.

    Sólo mis 2 centavos.

    Establezca su vista en main.xml onCreate, luego infle de row.xml

    Main.xml

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="450dp" > <ListView android:id="@+id/mainListView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@+id/size" android:layout_below="@+id/editText1" android:gravity="fill_vertical|fill_horizontal" android:horizontalSpacing="15dp" android:isScrollContainer="true" android:numColumns="1" android:padding="5dp" android:scrollbars="vertical" android:smoothScrollbar="true" android:stretchMode="columnWidth" > </ListView> <TextView android:id="@+id/size" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:background="#ff444444" android:gravity="center" android:text="TextView" android:textColor="#D3D3D3" android:textStyle="italic" /> </EditText> </RelativeLayout> 

    Row.xml

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:paddingTop="3dp"> <TextView android:id="@+id/rowTextView" android:layout_width="0dip" android:layout_height="41dp" android:layout_margin="4dp" android:layout_weight="2.83" android:ellipsize="end" android:gravity="center_vertical" android:lines="1" android:text="John Doe" android:textColor="@color/color_white" android:textSize="23dp" > </TextView> </LinearLayout> 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.