ScrollView包含ListView出现的问题解决

来源:互联网 发布:php 字符串true false 编辑:程序博客网 时间:2024/06/06 05:04

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);            }        }}
0 0
原创粉丝点击