如何在Android中利用滚动视图对显示数据表格进行嵌套

  介绍

本篇文章为大家展示了如何在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中利用滚动视图对显示数据表格进行嵌套