您的位置:首页 > 其它

当ScrollView中内嵌GridView解决GridView和ScrollView重复滚动的问题

2015-09-16 16:37 465 查看
写一个自定义的类,继承GridView,然后:

package com.kingpoint.gmcchh.widget;

import android.content.Context;

import android.util.AttributeSet;

import android.widget.GridView;

/**

*@Project:StartUpActivity4.05

*@Author:LiJie

*@CreateTime:2015-9-14下午5:19:44

**/

public class MyGridView extends GridView {

public MyGridView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

// TODO Auto-generated constructor stub

}

public MyGridView(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

}

public MyGridView(Context context) {

super(context);

// TODO Auto-generated constructor stub

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// TODO Auto-generated method stub

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

super.onMeasure(widthMeasureSpec, expandSpec);

}

}

该自定义控件只是重写了GridView的onMeasure方法,使其不会出现滚动条,ScrollView嵌套ListView也是同样的道理,不再赘述。

关于为什么只显示一行,个人理解是:如果单独使用GridView和ListView,里面的内容是固定的,底层系统很容易计算出控件要占用的宽高,当外面嵌套一层ScrollView后,就能做上下或左右滑动,但能滑动多少系统不知道,这时就需要你给计算出一个滑动区域给ScrollView。而这个数值就是通过GridView和ListView中的内容总的宽高之和。有更精确的理解欢迎赐教。解决的办法有两种:
方法一:就是上面说的通过计算出来ListView或者GridView中的子列高度和
进行显示:


public void setListViewHeightBasedOnChildren(ListView listView) {

ListAdapter listAdapter = listView.getAdapter();

if (listAdapter == null) {

return;

}



int totalHeight = 0;

for (int i = 0; i < listAdapter.getCount(); i++) {

View listItem = listAdapter.getView(i, null, listView);

listItem.measure(0, 0);

totalHeight += listItem.getMeasuredHeight();

}



ViewGroup.LayoutParams params = listView.getLayoutParams();

params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));

((MarginLayoutParams)params).setMargins(15, 15, 15, 15);

listView.setLayoutParams(params);

}

方法二:重写GridView和ListView的onMeasure方法,直接给它一个足够大的高度:
重写ListView:

public class MyListView extends ListView {




public MyListView(Context context) {

// TODO Auto-generated method stub

super(context);

}



public MyListView(Context context, AttributeSet attrs) {

// TODO Auto-generated method stub

super(context, attrs);

}



public MyListView(Context context, AttributeSet attrs, int defStyle) {

// TODO Auto-generated method stub

super(context, attrs, defStyle);

}



@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// TODO Auto-generated method stub

int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}

}

重写GridView:

public class MyGridView extends GridView{

public MyGridView(Context context, AttributeSet attrs) {

super(context, attrs);

}



public MyGridView(Context context) {

super(context);

}



public MyGridView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}



@Override

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {



int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,

MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: