android ScrollView中嵌套GridView,ListView只显示一行的解决办法

来源:互联网 发布:war3 for mac打不开 编辑:程序博客网 时间:2024/06/05 19:10
因为在Android中,有这样一个限制,两ScrollView型的控件不能相互嵌套。像ListView和GridView就都是ScrollView型的控件。因为嵌套后,两个ScrollView型控件的滑动效果就丧失了,同时被嵌套控件的高度也被限定为一行的高度。那我们还能不能嵌套两个ScrollView型的控件呢?肯定是可以的。方法有两种:一是我们去需要自定义ListView或是GridView,并重写其onMeasure()方法。

方法一:

重写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);         } }
xml中的布局:

<com.xxx.MyGridView              android:id="@+id/mygridview"              android:layout_width="fill_parent"              android:layout_height="wrap_content"              android:gravity="center"              android:horizontalSpacing="5dp"              android:numColumns="4"              android:stretchMode="columnWidth"              android:verticalSpacing="6dp" /> 
此方案亲测有效。

方法二:通过计算出来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(10, 10, 10, 10);    listView.setLayoutParams(params);  } 
此方案,测试过同样可以达到效果

转自:http://blog.csdn.net/luohai859/article/details/39347583

0 0
原创粉丝点击