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>
Debería usar ExpandableListView
( http://developer.android.com/reference/android/widget/ExpandableListView.html ). Tendría dos secciones en lugar de dos listas pero se alinearán (incluidos los encabezados) como describió.
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();
}
}
}