本篇文章为大家展示了如何在Android中利用滚动视图对显示数据表格进行嵌套,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
<强> Android中ScrollView嵌套显示数据表格强>
在Android开发中,经常有一些UI需要进行固定风格的动态布的局,然而由于现在的UI都喜欢把一个界面拉的很长,所以我们很多情况下需要使用滚动视图来嵌套列表控件来实现UI。这样就导致了很多不顺心的问题。
<强>问题一:列表控件显示不完全强>
原因是嵌套情况下,滚动视图不能正确的计算列表控件的高度。
<强>有两种解决方案强>
<强>方案一
强>
在适配器赋值完成后代码动态计算列表的高度。这里贴出ListView的计算代码,显示数据表格的计算方式类似,不过需要考虑列数、下面代码没有加上列表控件填充的计算,如果你设置了这个属性,需要加上计算代码
public void setListViewHeightBasedOnChildren (ListView 列表视图),{,, ,,,//,获取ListView对应的Adapter , ,,,ListAdapter ListAdapter =, listView.getAdapter ();,, ,,,if (listAdapter ==, null), {,, ,,,,,回来,,, ,,,},, ,,,int totalHeight =, 0;,, ,,,for (int 小姐:=,0,,len =, listAdapter.getCount();,小姐:& lt;, len;,我+ +),{,, ,,,,,//,listAdapter.getCount()返回数据项的数目,, ,,,,,View listItem =, listAdapter.getView (null,我还以为,列表视图),,, ,,,,,//,计算子项View 的宽高,, ,,,,,listItem.measure (0, 0),,, ,,,,,//,统计所有子项的总高度,, ,,,,,totalHeight +=, listItem.getMeasuredHeight ();,, ,,,},, ,,,ViewGroup.LayoutParams params =, listView.getLayoutParams ();,, ,,,params.height =, totalHeight +, (listView.getDividerHeight (), *, (listAdapter.getCount(),安康;1)),,, ,,,//,listView.getDividerHeight()获取子项间分隔符占用的高度,, ,,,//,params.height最后得到整个ListView完整显示需要的高度,, ,,,listView.setLayoutParams (params);,, 以前,,}><强>方案二强>
重写列表控件的onMeasure方法,这种方案不会出现列表控件本身的滚动条,并且viewholder复用机制会失效
@Override public 才能;void  onMeasure (int widthMeasureSpec, int heightMeasureSpec), { ,,,int expandSpec =, MeasureSpec.makeMeasureSpec (1, & lt; & lt;, 16日,MeasureSpec.AT_MOST); ,,,super.onMeasure (expandSpec widthMeasureSpec也); 以前,,}>方案一代码多,需要多次写,建议写成工具类方便调用;方案二在数据量大到不能一屏显示完的情况下会有性能问题,而且快速滑动的时候滚动视图会不停的去计算列表控件的高度。贼影响绘制性能。
两种方案有利有弊,大家自己取舍问题二:列表控件自动获取焦点,导致ScrollView自动滚动到列表控件所在的位置
这个问题其实有很多种解决方案,归结起来是两种。
<强>方案一
强>等待列表控件数据全部加载完成后(包括图片加载)调用ScrollView.fullScroll (ScrollView.FOCUS_UP);
方法让ScrollView滚动到顶部。这个加载完成的时间不好控制,搞得不好会有滚动动画出现,很尴尬的事情。
<强>方案二强>
重写列表控件的如下两个方法,使之固定返回假
@Override public 才能;boolean  isFocused (), { ,,,return 假; ,,} @Override才能 public 才能;boolean  requestFocus (int 方向,Rect previouslyFocusedRect), { ,,,return 假; 以前,,}>两种方案的优缺点很明显,喔,第二种方案的缺点我目前没发现,如果你这么使用发现了什么坑,请留言告知
<强>问题三滑动冲突强>
这问题就更操蛋了,根据UI的不同,操蛋程度也不同,涉及到视图的事件传递知识,很难给出所有情况的解决代码
解决起来也离不开几个要点,不过首先你得熟悉视图的事件传递
你需要根据情况决定重写列表控件与滚动视图的如下几个方法,根据情况给方法返回不同的bool值来告诉控件是否拦截或者传递事件,需要哪个控件相应哪个方向的滚动事件就拦截哪个方向的事件传递,作为一个有追求的开发者,切记不要一通乱拦截
, @Override public 才能;boolean  onTouchEvent (MotionEvent ev), { ,,,return super.onTouchEvent (ev); ,,} @Override才能 public 才能;boolean  onInterceptTouchEvent (MotionEvent ev), { ,,,return super.onInterceptTouchEvent (ev); ,,} @Override才能 public 才能;boolean  dispatchTouchEvent (MotionEvent ev), { ,,,return super.dispatchTouchEvent (ev); 以前,,}如何在Android中利用滚动视图对显示数据表格进行嵌套