工具篇——ListViewForScrollView(解决ScrollView嵌套ListView,ListView显示不全的问题)

代码如下:

package com.wy.test.other;

import android.content.Context;

import android.util.AttributeSet;

import android.widget.ListView;

/**

* 解决ScrollView嵌套ListView,ListView显示不全的问题

* 注意:ScrollView嵌套ListView时,如果ListView很长超出了屏幕的高度,

* 那么ScrollView会自动滚动到ListView的顶部,

* 但是我们需要默认在整体页面顶部,所以在初始化的时候就让ScrollView获得焦点,滚动条自然就显示到顶部了。

* scrollView.setFocusable(true);

* scrollView.setFocusableInTouchMode(true);

* scrollView.requestFocus();

*/

public class ListViewForScrollView extends ListView {

    public ListViewForScrollView(Context context) {

        super(context);

    }

    public ListViewForScrollView(Context context, AttributeSet attrs) {

        super(context, attrs);

    }

    public ListViewForScrollView(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

    }

    /**

     * 重写onMeasure方法,重新计算高度,达到使ListView适应ScrollView的效果

     *

     * @param widthMeasureSpec  宽度测量规则

     * @param heightMeasureSpec 高度测量规则

     */

    @Override

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        //Integer.MAX_VALUE:表示int类型能够表示的最大值,值为2的31次方-1

        //>>2:右移N位相当于除以2的N的幂

        //MeasureSpec.AT_MOST:子布局可以根据自己的大小选择任意大小的模式

        int newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);

        super.onMeasure(widthMeasureSpec, newHeightMeasureSpec);

    }

}

在项目中的应用:

1.在xml布局文件中直接使用;





    

        

            

            

        

    


2.注意:ScrollView嵌套ListView时,如果ListView很长超出了屏幕的高度,
那么ScrollView会自动滚动到ListView的顶部,但是我们需要默认在
整体页面顶部,所以在初始化的时候就让ScrollView获得焦点,
滚动条自然就显示到顶部了。

package com.wy.test;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ListView;

import android.widget.ScrollView;

import butterknife.ButterKnife;

import butterknife.InjectView;

/**

* ListViewForScrollView的使用

*/

public class ListViewForScrollViewActivity extends BaseActivity {

    @InjectView(R.id.lv)

    ListView lv;

    @InjectView(R.id.scrollView)

    ScrollView scrollView;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_listviewforscrollview);

        ButterKnife.inject(this);

        lv.setAdapter(baseAdapter);

        //让ScrollView获得焦点

        scrollView.setFocusable(true);

        scrollView.setFocusableInTouchMode(true);

        scrollView.requestFocus();

    }

    BaseAdapter baseAdapter = new BaseAdapter() {

        @Override

        public int getCount() {

            return 100;

        }

        @Override

        public Object getItem(int position) {

            return null;

        }

        @Override

        public long getItemId(int position) {

            return 0;

        }

        @Override

        public View getView(int position, View convertView, ViewGroup parent) {

            if (convertView == null) {

                convertView = View.inflate(getApplicationContext(), R.layout.item_gridviewforscrollview, null);

            }

            return convertView;

        }

    };

}

你可能感兴趣的:(工具篇——ListViewForScrollView(解决ScrollView嵌套ListView,ListView显示不全的问题))