web-dev-qa-db-fra.com

Android Comment afficher 2 listes de vues dans une activité l'une après l'autre

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

41
Shivam Bhalla

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

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>

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();
        }
    }
}
100
Hiren Patel

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.

9
boro

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.

5
Kirill Boyarshinov

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.

2
DynamicMind

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



}
1
Adam

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.

enter image description here

1
T.M

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>
0
Trideep Rath