Android list view inside a scroll view

后端 未结 30 1930
一向
一向 2020-11-21 13:43

I have an android layout which has a scrollView with a number of elements with in it. At the bottom of the scrollView I have a listView

相关标签:
30条回答
  • 2020-11-21 13:54

    Update

    <ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="2"
    android:fillViewport="true"
    android:gravity="top" >
    
    <LinearLayout
        android:id="@+id/foodItemActvity_linearLayout_fragments"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>
    

    to

    <ScrollView
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="2"
    android:fillViewport="true"
    android:gravity="top" >
    
    <LinearLayout
        android:id="@+id/foodItemActvity_linearLayout_fragments"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>
    

    The point here is you are trying to set height to 0dp (fixed)

    0 讨论(0)
  • 2020-11-21 13:57

    You can easy put ListView in ScrollView! Just need to change height of ListView programmatically, like this:

        ViewGroup.LayoutParams listViewParams = (ViewGroup.LayoutParams)listView.getLayoutParams();
        listViewParams.height = 400;
        listView.requestLayout();
    

    This works perfectly!

    0 讨论(0)
  • 2020-11-21 13:58

    The answer is simple and I am surprised it has yet to be answered here.

    Use a Header View or/and Footer View on the list itself. Don't mix a ScrollView with a ListView or anything that can scroll. It's meant to be used with headers and footers :)

    Essentially, take all the content above your ListView, put it in another .xml file as a layout and then in code inflate it and add it to the list as a header view.

    i.e.

    View header = getLayoutInflater().inflate(R.layout.header, null);
    View footer = getLayoutInflater().inflate(R.layout.footer, null);
    listView.addHeaderView(header);
    listView.addFooterView(footer);
    
    0 讨论(0)
  • 2020-11-21 13:58
        public static void setListViewHeightBasedOnChildren(ListView listView) {
        // 获取ListView对应的Adapter
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            return;
        }
    
        int totalHeight = 0;
        for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0); // 计算子项View 的宽高
            totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
        }
    
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight
                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        // listView.getDividerHeight()获取子项间分隔符占用的高度
        // params.height最后得到整个ListView完整显示需要的高度
        listView.setLayoutParams(params);
    }
    

    you can use this code for listview in scrollview

    0 讨论(0)
  • 2020-11-21 13:58

    My requirement is to include a ListView of equally-sized items within a ScrollView. I tried a few of the other solutions listed here, none seemed to size the ListView correctly (either too little space or too much). Here's what worked for me:

        public static void expandListViewHeight(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null)
            return;
    
        ViewGroup.LayoutParams params = listView.getLayoutParams();
        listView.measure(0, 0);
        params.height = listView.getMeasuredHeight() * listAdapter.getCount() + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        listView.setLayoutParams(params);
    }
    

    Hope this helps someone.

    0 讨论(0)
  • 2020-11-21 13:58

    This worked for me (link1, link2):

    • You Create Custom ListView Which is non Scrollable

      public class NonScrollListView extends ListView {
      
              public NonScrollListView(Context context) {
                  super(context);
              }
              public NonScrollListView(Context context, AttributeSet attrs) {
                  super(context, attrs);
              }
              public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
                  super(context, attrs, defStyle);
              }
              @Override
              public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                  int heightMeasureSpec_custom = View.MeasureSpec.makeMeasureSpec(
                          Integer.MAX_VALUE >> 2, View.MeasureSpec.AT_MOST);
                  super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
                  ViewGroup.LayoutParams params = getLayoutParams();
                  params.height = getMeasuredHeight();
              }
          }
      
    • In Your Layout File

      <ScrollView 
       xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:fillViewport="true">
      
          <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content" >
      
              <!-- com.Example Changed with your Package name -->
      
              <com.thedeveloperworldisyours.view.NonScrollListView
                  android:id="@+id/lv_nonscroll_list"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content" >
              </com.thedeveloperworldisyours.view.NonScrollListView>
      
              <RelativeLayout
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:layout_below="@+id/lv_nonscroll_list" >
      
                  <!-- Your another layout in scroll view -->
      
              </RelativeLayout>
          </RelativeLayout>
      
      </ScrollView>
      
    • Create a object of your customListview instead of ListView like :

       NonScrollListView non_scroll_list = (NonScrollListView) findViewById(R.id.lv_nonscroll_list);
      
    0 讨论(0)
提交回复
热议问题