Android中listview嵌套scrollveiw冲突的解决方法
一.使用网上用的动态改变listview高度的方法
该方法只适用于item布局是LinearLayout布局的情况,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。所以使用限制较大。
publicclassUtility{ publicstaticvoidsetListViewHeightBasedOnChildren(ListViewlistView){ //获取ListView对应的Adapter ListAdapterlistAdapter=listView.getAdapter(); if(listAdapter==null){ //pre-condition return; } inttotalHeight=0; for(inti=0,len=listAdapter.getCount();i<len;i++){//listAdapter.getCount()返回数据项的数目 ViewlistItem=listAdapter.getView(i,null,listView); listItem.measure(0,0);//计算子项View的宽高 totalHeight+=listItem.getMeasuredHeight();//统计所有子项的总高度 } ViewGroup.LayoutParamsparams=listView.getLayoutParams(); params.height=totalHeight+(listView.getDividerHeight()*(listAdapter.getCount()-1)); //listView.getDividerHeight()获取子项间分隔符占用的高度 //params.height最后得到整个ListView完整显示需要的高度 listView.setLayoutParams(params); } }
二.网上有帖子说在ScrollView中添加一属性android:fillViewport="true",这样就可以让ListView全屏显示了。在我机器上测试失败了。
三.重写ListView、gridView(推荐)
重写ListView:
publicclassMyListViewextendsListView{ publicMyListView(Contextcontext){ //TODOAuto-generatedmethodstub super(context); } publicMyListView(Contextcontext,AttributeSetattrs){ //TODOAuto-generatedmethodstub super(context,attrs); } publicMyListView(Contextcontext,AttributeSetattrs,intdefStyle){ //TODOAuto-generatedmethodstub super(context,attrs,defStyle); } @Override protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){ //TODOAuto-generatedmethodstub intexpandSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec,expandSpec); } }
重写GridView:
/** *自定义gridview,解决ScrollView中嵌套gridview显示不正常的问题(1行) */ publicclassMyGridViewextendsGridView{ publicMyGridView(Contextcontext,AttributeSetattrs){ super(context,attrs); } publicMyGridView(Contextcontext){ super(context); } publicMyGridView(Contextcontext,AttributeSetattrs,intdefStyle){ super(context,attrs,defStyle); } @Override publicvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){ intexpandSpec=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec,expandSpec); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。