您的位置:首页 > 其它

ScrollView--嵌套GridView的解决办法

2015-12-20 21:58 375 查看
前些日子在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便会出问题,即GridView会显示不全。

解决办法,自定义一个GridView控件

[java] view plaincopy

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);

}

}

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

XML布局代码

[html] view plaincopy

<ScrollView Android:layout_height="wrap_content"

Android:layout_width="fill_parent" android:id="@+id/scroll_content">

<com.yourclass.MyGridView xmlns:Android="http://schemas.android.com/apk/res/android"

Android:id="@+id/grid_view" android:layout_width="fill_parent"

Android:layout_height="wrap_content" android:numColumns="auto_fit"

Android:horizontalSpacing="1dip" android:verticalSpacing="1dip"

Android:columnWidth="150dip" android:stretchMode="columnWidth"

Android:gravity="center">

</com.yourclass.MyGridView>

</ScrollView>

Java调用代码

[java] view plaincopy

MyGridView gridview = (MyGridView) findViewById(R.id.grid_view);

gridview.setAdapter(new ImageAdapter(this));

========================

1.使用网上用的动态改变listview高度的方法,该方法只适用于item布局是LinearLayout布局的情况,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。所以使用限制较大。

Java代码


public class Utility {

public static void setListViewHeightBasedOnChildren(ListView listView) {

//获取ListView对应的Adapter

ListAdapter listAdapter = listView.getAdapter();

if (listAdapter == null) {

// pre-condition

return;

}

int totalHeight = 0;

for (int i = 0, len = listAdapter.getCount(); i < len; i++) { //listAdapter.getCount()返回数据项的数目

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

listItem.measure(0, 0); //计算子项View 的宽高

totalHeight += listItem.getMeasuredHeight(); //统计所有子项的总高度

}

ViewGroup.LayoutParams params = listView.getLayoutParams();

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

//listView.getDividerHeight()获取子项间分隔符占用的高度

//params.height最后得到整个ListView完整显示需要的高度

listView.setLayoutParams(params);

}

}

2.网上有帖子说在ScrollView中添加一属性 android:fillViewport="true" ,这样就可以让ListView全屏显示了。在我机器上测试失败了。

3.重写ListView、gridView(推荐):

重写ListView

Java代码


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

Java代码


/**

* 自定义gridview,解决ListView中嵌套gridview显示不正常的问题(1行半)

* @author wangyx

* @version 1.0.0 2012-9-14

*/

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);

}

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