Android, как отображать 2 списка в одном действии один за другим

Я использовал этот код, чтобы отображать 2 вида списка один поверх другого.

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

Проблема в том, что это приводит к тому, что по 2 спискам каждый занимает половину экрана. Я добавляю заголовок для обоих списков, подобных этому.

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

Я хотел бы, чтобы заголовок второго списка появлялся после завершения первого списка. Как мне это сделать? Как сделать представление списка таким, чтобы второе начиналось с первого завершения? благодаря

Solutions Collecting From Web of "Android, как отображать 2 списка в одном действии один за другим"

Использовать следующим образом:

Удалить линейную компоновку. Используйте относительный макет и внутри этого места, как показано ниже.

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

Добавить 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(); } } 

В вашей деятельности :

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

Вы должны использовать ExpandableListView ( http://developer.android.com/reference/android/widget/ExpandableListView.html ). У вас будет два раздела вместо двух списков, но они (включая заголовки) будут выровнены по вашему описанию.

Не рекомендуется использовать более одного ListViews в одном контейнере. Это вызывает проблемы с измерением и производительностью. Лучше использовать единый ListView с несколькими типами просмотров . В вашем случае типы просмотра могут быть: listview1_viewtype , listview2_viewtype , listview2_header_viewtype . Для первого заголовка ListView вы можете использовать только заголовок.

Когда веса указаны, высота должна быть указана как 0dp или wrap_content. Но вы этого не делаете. Измените свой XML-файл, как показано ниже. Надеюсь, это сработает для вас.

Согласно вашему комментарию я редактирую свой пост в соответствии с требованием Решение

1-: создать представление списка только с двумя строками

1.1-: Добавить представление списка в виде дочернего элемента строки в первом списке # 1

1.2-: Добавить другой список в качестве второго дочернего элемента в первом списке # 1

Надеюсь, что вы добьетесь успеха.

Я тоже новичок в Android, и у меня что-то похожее (не совсем, но вроде обходное решение), но много EASIER, создав файл макета и поместив в него необходимое количество видов списка и другой формат XML и завернув ранее сделанный макет В ScrollView.

Предположим, что у вас есть макет с именем two_listview_layout.xml, определенный как

 <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 здесь не обязательно, но вы можете играть с вашими требованиями и макетами.

Теперь создайте другой макет, в котором этот макет завернут в ScrollView. Поскольку ScrollView может иметь только один прямой дочерний элемент, у вас будет этот полный макет в качестве его дочернего элемента.

Назовите этот (ниже) макет как final_layout.xml

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

Теперь раздуйте этот final_layout.xml в своем фрагменте / активности и используйте идентификаторы, которые были названы в файле two_listview_layout.xml, для доступа к любому из списков.

Вывод выглядит примерно так: (извинения за плохое качество рекордера экрана: p) Trailers and Reviews – оба являются списками здесь.

Введите описание изображения здесь

Попробуйте использовать ScrollView и 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)); } 

Добавление layout_weight работало для меня.

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

Попробуйте с относительной компоновкой:

 <?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>