Android 自定义组件之 带有悬浮header的listview

  最近做项目遇到一个需求,要做一个带有悬浮header的listview,即,当listview滑动时,header消失,静止时header浮现。

  这个需求看似简单,实际做起来还是会遇到不少的困难,特此记录过程,以做记录。

  首先,我们来看看需求,如下图。

  

  有了需求,我们就可以开始做具体分析了,首先我们想到的是给listview添加一个滑动监听,在滑动时隐藏header在静止的时候就显示header。

  关键代码如下:

  

  其中play()就是我们的隐藏/显示 header的方法啦

  写好了监听之后我们开始写隐藏/显示的PLAY()方法

  首先我们来写一个简单的版本

  可以看到我们通过第一个布尔参数来判断是隐藏还是显示。

  做到这里看似已经完成了,但是有更多的细节是需要打磨的,由于我们采用的FrameLayout进行布局,当我们在顶部的时候会发现第一条记录被挡住了,这可不行。

  不过我们可以通过设置listview的padding还解决,代码如下。

1 int i = textview.getLayoutParams().height;
2 list.setPadding(0,i,0,0);
  现在运行我们的程序,好像已经完成了,但是这个时候可恶的BUG又出来捣乱了。

  当我们只有少量记录(比屏幕显示多一条)的时候,会出现padding设置了之后无法还原的情况,这是因为虽然第一条记录被隐藏了一部分,但是并不是完全隐藏,所以不会触发listview的top事件。

  这时候我们就需要在每次滑动的时候去检测滑动的距离,来判断是不是需要设置padding了,如果第一条记录都没有被隐藏,那么显然我们是不需要设置padding的。

  

  这就是判断滑动距离的函数啦。

  至此,一个简单的悬浮header listview已经完成了。

  接下来是完整的布局和代码

  布局:

  代码:

u3coding

A software developer

Leave a Comment

Your email address will not be published. Required fields are marked *

*