studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android listview android-layout-weight

para - manual de programacion android pdf



Android cómo mostrar 2 listas de vista en una actividad, una después de la otra (9)

He usado este código para mostrar 2 ver lista una encima de la otra.

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_weight="1" android:background="#f00" > </ListView> <ListView android:id="@+id/listView2" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_weight="1" android:background="#0f0" > </ListView>

El problema es que esto provoca que las 2 vistas de lista ocupen la mitad de la pantalla. Estoy agregando un encabezado a ambas listas como esta.

LevelAdapter adapter = new LevelAdapter(getActivity(), R.layout.list_item, weather_data); View header = inflater.inflate(R.layout.header2, null); View header2 = inflater.inflate(R.layout.header, null); lv1.addHeaderView(header); lv2.addHeaderView(header2); lv1.setAdapter(adapter); lv2.setAdapter(adapter);

Me gustaría que el encabezado de la segunda lista aparezca después de que termine la primera lista. ¿Cómo hago esto? ¿Cómo hago que las vistas de lista aparezcan de manera que la segunda comienza cuando termina la primera? Gracias


Agregar layout_weight me funcionó.

<ListView android:id="@+id/excerciseListView" android:layout_width="match_parent" android:layout_height="0px" android:divider="#B6B6B6" android:dividerHeight="1sp" android:layout_weight="3"></ListView> <ListView android:id="@+id/instructionListView" android:layout_width="match_parent" android:layout_height="0px" android:divider="#B6B6B6" android:dividerHeight="1sp" android:layout_weight="1"></ListView>



No es una buena práctica usar más de un ListViews en un solo contenedor. Causa problemas de medición y rendimiento. Mejor es usar un solo ListView con varios tipos de vista . En su caso, los tipos de vista podrían ser: listview1_viewtype , listview2_viewtype , listview2_header_viewtype . Para el primer encabezado de ListView puedes usar solo el encabezado.


Pruebe con ScrollView y LinearLayout:

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/action_bar1" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dip"> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="200dip" android:layout_margin="10dip" android:background="#B29090"> </ListView> <ListView android:id="@+id/listview2" android:layout_width="match_parent" android:layout_height="200dip" android:layout_margin="10dip" android:background="#4A9C67"> </ListView> </LinearLayout> </ScrollView> </RelativeLayout>

MainActivity.java

private ListView list1, list2; private String [] data1 ={"H", "P", "D", "N", "P", "P"}; private String [] data2 ={"K", "M", "B", "K", "A", "K"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sounds); list1 = (ListView) findViewById(R.id.listView1); list2 = (ListView) findViewById(R.id.listview2); list1.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1,data1)); list2.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1,data2)); }


Pruebe con el diseño relativo:

<?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="fill_parent" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_weight="1" android:layout_below="@+id/listView1" android:background="#f00" > </ListView> <ListView android:id="@+id/listView2" android:layout_width="match_parent" android:layout_height="fill_parent" android:layout_weight="1" android:background="#0f0" > </ListView> </RelativeLayout>


También soy nuevo en Android y obtuve algo similar (no exactamente, sino una especie de solución alternativa) pero mucho MÁS FÁCIL, al hacer un archivo de diseño y poner el número requerido de vistas de lista en él y otro diseño XML y ajustar el diseño realizado previamente en ScrollView.

Supongamos que tiene un diseño llamado two_listview_layout.xml definido como

<RelativeLayout ..> <ListView android:id="@+id/listViewOne" android:layout_width="match_parent" android:layout_height="wrap_content"/> <ListView android:id="@+id/listViewTwo" android:layout_width="match_parent" android:layout_width="wrap_content"/> </RelativeLayout>

RelativeLayout no es obligatorio aquí, pero puede jugar con sus requisitos y diseños.

Ahora haga otro diseño en el que este diseño se ajuste en ScrollView. Como ScrollView puede tener solo 1 hijo directo, tendrá este diseño completo como hijo.

Nombre este diseño (a continuación) como final_layout.xml

<FrameLayout ...> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <include layout="@layout/two_listview_layout" /> </ScrollView> </FrameLayout>

Ahora infle este final_layout.xml en su fragmento / actividad y use los Id''s que fueron nombrados en el dos_listview_layout.xml para acceder a cualquiera de la vista de lista.

La salida es algo como esto: (disculpas por la mala calidad de la grabadora de pantalla: p) Trailers y reseñas: ambas son listas aquí.


Use como esto:

Eliminar diseño lineal. utilice el diseño relativo y dentro de ese lugar su vista de dos listas como esta.

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/scrollojt" android:fillViewport="true" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#f00" > </ListView> <ListView android:id="@+id/listView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/listView1" android:background="#0f0" > </ListView> </RelativeLayout> </ScrollView>

agregar Utility.java

public class Utility { public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST); for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); listView.requestLayout(); } }

En tu actividad :

lv1.setAdapter(adapter); lv2.setAdapter(adapter); Utility.setListViewHeightBasedOnChildren(lv1); Utility.setListViewHeightBasedOnChildren(lv2);


cuando se proporcionan pesos, la altura debe proporcionarse como 0dp o wrap_content. pero no lo estás haciendo cambia tu archivo xml como se muestra a continuación. Espero que te sirva

según su comentario, estoy editando mi publicación de acuerdo con el requisito Solución

1-: Crea una vista de lista con solo 2 filas

1.1-: Agregar una vista de lista como un hijo de la fila en la primera lista de vista # 1

1.2-: Agregue otra vista de lista como secundario en la primera lista # 1

Espero que de esta forma puedas alcanzar el éxito.


activity_main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:fillViewport="true" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="10dip" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:text="ANDROID" /> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:background="#B29090" > </ListView> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:gravity="center_vertical" android:text="IOS" /> <ListView android:id="@+id/listView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:background="#4A9C67" > </ListView> </LinearLayout> </ScrollView>

MainActivity.java

package com.example.listviewin1xmldemo; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.View.MeasureSpec; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.ListView; public class MainActivity extends ActionBarActivity { private ListView mListView1, mListView2; private String [] data1 ={"Hiren", "Pratik", "Dhruv", "Narendra", "Piyush", "Priyank"}; private String [] data2 ={"Kirit", "Miral", "Bhushan", "Jiten", "Ajay", "Kamlesh"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mListView1 = (ListView)findViewById(R.id.listView1); mListView2 = (ListView)findViewById(R.id.listView2); mListView1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data1)); mListView2.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data2)); ListUtils.setDynamicHeight(mListView1); ListUtils.setDynamicHeight(mListView2); } public static class ListUtils { public static void setDynamicHeight(ListView mListView) { ListAdapter mListAdapter = mListView.getAdapter(); if (mListAdapter == null) { // when adapter is null return; } int height = 0; int desiredWidth = MeasureSpec.makeMeasureSpec(mListView.getWidth(), MeasureSpec.UNSPECIFIED); for (int i = 0; i < mListAdapter.getCount(); i++) { View listItem = mListAdapter.getView(i, null, mListView); listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED); height += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = mListView.getLayoutParams(); params.height = height + (mListView.getDividerHeight() * (mListAdapter.getCount() - 1)); mListView.setLayoutParams(params); mListView.requestLayout(); } } }