J'ai utilisé ce code pour afficher 2 vues de liste superposées.
<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>
Le problème est que cela entraîne que les 2 listes de vues occupent chacune la moitié de l'écran. J'ajoute un en-tête aux deux listes comme ceci.
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);
J'aimerais que l'en-tête de la deuxième liste apparaisse après la fin de la première liste. Comment faire en sorte que la liste apparaisse telle que la seconde commence lorsque la première est terminée? Merci
Utilisez comme ceci:
Supprimer la disposition linéaire. utilisez la disposition relative et à l'intérieur, placez votre vue liste à deux comme ceci.
<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>
ajouter 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();
}
}
dans votre activité:
lv1.setAdapter(adapter);
lv2.setAdapter(adapter);
Utility.setListViewHeightBasedOnChildren(lv1);
Utility.setListViewHeightBasedOnChildren(lv2);
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();
}
}
}
Vous devez utiliser ExpandableListView
( http://developer.Android.com/reference/Android/widget/ExpandableListView.html ). Vous auriez deux sections au lieu de deux listes, mais elles (y compris les en-têtes) seront alignées comme vous l'avez décrit.
Il n'est pas recommandé d'utiliser plus d'une ListViews dans un même conteneur. Cela pose des problèmes de mesure et de performance. Mieux vaut utiliser un seul ListView avec plusieurs types de vues . Dans votre cas, les types de vues pourraient être: listview1_viewtype , listview2_viewtype , listview2_header_viewtype . Pour le premier en-tête de ListView, vous pouvez utiliser uniquement l'en-tête.
lorsque des poids sont fournis, la hauteur doit être égale à 0dp ou wrap_content. mais vous ne le faites pas. changez votre fichier XML comme ci-dessous. J'espère que cela fonctionne pour vous.
selon votre commentaire je suis éditer mon post selon l'exigence Solution
1-: créer une liste avec seulement 2 lignes
1.1-: Ajouter une vue liste sous la forme d'un enfant de ligne dans la première vue liste # 1
1.2-: Ajouter une autre vue liste en tant qu'enfant de deuxième ligne dans la première vue liste # 1
j'espère que de cette façon, vous pourrez réussir.
Essayez avec ScrollView et 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));
}
Je suis nouveau sur Android également et j’ai obtenu quelque chose de similaire (pas exactement, mais un type de solution de contournement) mais beaucoup plus facile, en créant un fichier de présentation et en y insérant le nombre requis de vues de liste et une autre mise en page XML et envelopper la mise en page précédemment faite dans ScrollView.
Supposons que la disposition nommée two_listview_layout.xml soit définie comme
<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 n'est pas obligatoire ici, mais vous pouvez jouer avec vos exigences et les dispositions.
Créez maintenant une autre mise en page dans laquelle cette mise en forme est encapsulée dans ScrollView. Comme ScrollView ne peut avoir qu’un seul enfant direct, vous aurez cette mise en page complète comme enfant.
Nommez cette mise en page (ci-dessous) comme final_layout.xml
<FrameLayout
...>
<ScrollView
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<include layout="@layout/two_listview_layout" />
</ScrollView>
</FrameLayout>
Maintenant, gonflez ce fichier final_layout.xml dans votre fragment/activité et utilisez les identifiants qui ont été nommés dans le two_listview_layout.xml pour accéder à n’importe lequel des listview.
La sortie ressemble à ceci: (excuses pour la mauvaise qualité de l’enregistreur d’écran: p) Remorques et Avis - les deux sont des listes de vues ici.
L'ajout de layout_weight a fonctionné pour moi.
<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>