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

代码如下:

package com.wy.test.other;

import android.content.Context;

import android.util.AttributeSet;

import android.widget.GridView;

/**

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

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

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

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

* scrollView.setFocusable(true);

* scrollView.setFocusableInTouchMode(true);

* scrollView.requestFocus();

*/

public class GridViewForScrollView extends GridView {

    public GridViewForScrollView(Context context) {

        super(context);

    }

    public GridViewForScrollView(Context context, AttributeSet attrs) {

        super(context, attrs);

    }

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

        super(context, attrs, defStyleAttr);

    }

    /**

     * 重写onMeasure方法,重新计算高度,达到使GridView适应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嵌套GridView时,如果GridView很长超出了屏幕的高度,
那么ScrollView会自动滚动到GridView的顶部,但是我们需要默认在
整体页面顶部,所以在初始化的时候就让ScrollView获得焦点,
滚动条自然就显示到顶部了。

package com.wy.test;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.GridView;

import android.widget.ScrollView;

import butterknife.ButterKnife;

import butterknife.InjectView;

/**

* GridViewForScrollView的使用

*/

public class GridViewForScrollViewActivity extends BaseActivity {

    @InjectView(R.id.gv)

    GridView gv;

    @InjectView(R.id.scrollView)

    ScrollView scrollView;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_gridviewforscrollview);

        ButterKnife.inject(this);

        gv.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;

        }

    };

}

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