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);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。