ScrollView包含ListView出现的问题解决

ScrollView包含ListView出现的显示不全

关于这个问题,其实有很多网上有很多种解决方法,这里是计算了
ListView的高度。
公式:listView总高度=(每个Item的内容高度条目数量)+(每条分割线高度(条目数量-1))+上下填充高度


  • 首先创建自定义View类继承ListView
    代码如下
package com.example.myandroid_test_listview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;

public class MyListView extends ListView {

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return super.onInterceptTouchEvent(ev);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(ev);
    }

}
  • 在XML布局文件中
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <com.example.myandroid_test_listview.MyListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
         />

</ScrollView>
  • 在activity中带如下,这里主要写的计算高度的方法,和设置高度
    代码如下
 package com.example.myandroid_test_listview;



import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.MeasureSpec;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ArrayAdapter;

public class MainActivity extends Activity {

      private MyListView lv;
        private ArrayList<String> list;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            //找控件

            lv = (MyListView) findViewById(R.id.lv);
            //准备数据
            setData();

            //为lv设置adapter
            lv.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, list));

            //设置lv的高度

            setListViewHeight(lv);

        }

        @SuppressWarnings("rawtypes")
        private void setListViewHeight(MyListView lv) {
            //获取lv的适配器
            ArrayAdapter adapter = (ArrayAdapter) lv.getAdapter();
            //判断适配器是否为空,如果为空,则证明没有数据,也就不用计算高度了
            if(adapter==null)
            {
                return;
            }

            //定义总高度变量 
            //listView总高度=(每个Item的内容高度*条目数量)+(每条分割线高度*(条目数量-1))+上下填充高度
            int sumHeight=0;
            //遍历adapter,得到每条item
            for (int i = 0; i < adapter.getCount(); i++) {
                /**
                 * position:每个item对应的索引 
                 * convertView:复用,设置为null 
                 * parent:对应此adapter的lv控件
                 */
                View item = adapter.getView(i,null,lv);
                //判断如果得到item不为空的话,则得到此item的高度,与总高度进行相加
                if(item!=null)
                {
                    //设置item所在的布局参数
                    item.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
                    //设置每个条目的测量宽高的方式
                    item.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED);
                    //总高加每个item高度
                    sumHeight+=item.getMeasuredHeight();

                }       

            }
            ViewGroup.LayoutParams params = lv.getLayoutParams();
            params.height=sumHeight
                    +(lv.getDividerHeight()*(adapter.getCount()-1))
                    +lv.getPaddingTop()+lv.getPaddingBottom();

            lv.setLayoutParams(params);

        }

        private void setData() {
            list = new ArrayList<String>();
            for (int i = 0; i < 20; i++) {
                list.add("条目"+i);
            }

        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值