ScrollView--嵌套GridView的解决办法
前些日子在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便会出问题,即GridView会显示不全。
解决办法,自定义一个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);
- }
- }
该自定义控件只是重写了GridView的onMeasure方法,使其不会出现滚动条,ScrollView嵌套ListView也是同样的道理,不再赘述。
XML布局代码
- <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调用代码
- MyGridView gridview = (MyGridView) findViewById(R.id.grid_view);
- gridview.setAdapter(new ImageAdapter(this));
========================
1.使用网上用的动态改变listview高度的方法,该方法只适用于item布局是LinearLayout布局的情况,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。所以使用限制较大。
- 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
- 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
- /**
- * 自定义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);
- }
- }