Android comment afficher 2 listviews dans une activité, l'un après l'autre

j'ai utilisé ce code pour afficher 2 afficher la liste l'une par-dessus l'autre.

<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 provoque les 2 listviews pour occuper chacun la moitié de l'écran. J'ajoute un en-tête aux deux listes comme celui-ci.

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);

je voudrais l'en-tête de la deuxième liste à apparaître après la première liste. Comment dois-je faire?Comment puis-je faire apparaître les listviews de telle sorte que la seconde commence quand le premier est plus ? Merci

35
demandé sur S H 2013-07-17 11:20:20

9 réponses

utiliser comme ceci:

supprimer la disposition linéaire. utilisez la disposition relative et à l'intérieur de cet endroit vos deux Vue de liste 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 utilité.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);
41
répondu Nirmal 2013-07-17 07:58:03

Before scrolling

After scrolling 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>

activité principale.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();
        }
    }
}
94
répondu Hiren Patel 2015-05-14 05:59:26

vous devez utiliser ExpandableListView ( http://developer.android.com/reference/android/widget/ExpandableListView.html ). Vous aurez deux sections au lieu de deux listviews mais elles (incluant les en-têtes) seront alignées comme vous l'avez décrit.

9
répondu boro 2013-12-19 12:34:03

Ce n'est pas une bonne pratique d'utiliser plus d'un ListViews " dans un seul conteneur. Elle cause des problèmes de mesure et de performance. Mieux est d'utiliser ListView simple avec plusieurs types de vues . Dans votre cas, les types de vues peuvent être: listview1_viewtype , listview2_viewtype , listview2_header_viewtype . Pour L'en-tête de ListView, vous pouvez utiliser juste l'en-tête.

5
répondu Kirill Boyarshinov 2017-05-23 11:47:25

Essayez avec le 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>

activité principale.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));



}
3
répondu Adam 2017-01-10 10:49:01

lorsque des poids sont fournis, la hauteur doit être indiquée comme 0DP ou wrap_content. mais vous ne le font pas. modifier votre fichier xml, comme ci-dessous. J'espère que cela fonctionne pour vous.

selon votre commentaire, je suis en train d'éditer mon message selon la Solution d'exigence

1- : Créer une vue de liste avec seulement 2 ligne

1.1 -: ajouter une vue de liste comme un enfant de ligne dans la première listview #1

1.2 -: ajouter une autre liste enfant dans la première listview #1

j'espère que de cette façon vous pouvez atteindre le succès.

2
répondu DynamicMind 2013-07-17 07:58:44

Je suis nouveau pour Android aussi bien et j'ai obtenu quelque chose similaire (pas exactement mais genre de solution de contournement) mais beaucoup plus facile, en faisant un fichier de mise en page et en mettant le nombre requis de vues de liste dans elle et une autre mise en page XML et envelopper la mise en page précédemment faite dans ScrollView.

supposons que vous ayez une mise en page nommée two_listview_layout.xml défini 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 disposition.

faites maintenant une autre mise en page dans laquelle cette mise en page est enveloppée dans ScrollView. Comme ScrollView ne peut avoir qu'un seul enfant direct, vous aurez cette disposition complète comme son enfant.

nomme cette disposition (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>

gonflez maintenant ce FINAL.xml dans votre fragment / activité et utilisez les Id qui ont été nommés dans le two_listview_layout.xml pour accéder à listview.

La sortie est quelque chose comme ceci: (excuses pour la mauvaise qualité de l'enregistreur d'écran :p ) Trailers et les critiques - les deux sont des listviews ici.

enter image description here

1
répondu T.M 2016-02-09 18:22:58

ajouter 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>
0
répondu Trideep Rath 2015-01-21 09:28:42

Essayez avec une relative mise en page:

<?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>
-3
répondu Slenkra 2013-07-17 07:29:36