ListView实现下拉刷新(二)隐藏头布局
2015-10-10 15:31
357 查看
一、问题分析
在上一篇中,我们将头布局加到了ListView上。但是没有隐藏他。你可能会想,隐藏还不简单,直接给它设置为GONE属性不就可以了吗,在需要的时候再设定为可见。没错,这正是ListView实现分页加载时候的做法。但是实现分页加载时,只需要上拉一下,并没有和用户过多的互动。而实现下拉刷新时,一般的做法是,用户在下拉的时候,头布局会慢慢显示,以至于有一种被拉出来的感觉。而分页加载的做法确是只要发现用户下拉,就一下子全部显示出来了。所以这种做法显然不是我们想要的效果。
那么,我们根据我们想要的效果,就不难想到,我们需要一个方法,一个可以随着用户往下拉的幅度,而让头布局也慢慢跟随显示出来的方法。在这里,采用的方法就是隐藏头布局高度的方法,即即时设置它的paddingTop。这样,刚开始直接设定paddiingTop为高度的负值,就是全部隐藏的效果,然后随着用户下拉,不断传入用户下拉的幅度作为改变paddingTop的依据,这样子头布局就会慢慢被拉出来了。
思路有了,那么问题来了。第一,要获取头布局自身的高度。第二,要编写这个方法。代码里解释的很清晰了。我们直接看下面的代码吧。对于初学者,这是很大的技巧,应该认真学习。
二、实现头布局隐藏
废话不多说,需要注意的东西在代码注释里写的很清楚了。再次编写MyListView类,如下:
我再强调一遍吧。在获得header自身高度的时候,由于渲染header为view的时候并没有通知父布局它有多大。因此在获取之前,需要通知父布局它要占的宽和高。否则取到的高度永远是0.
好了,运行程序,发现头布局被隐藏了。一个难啃的难题解决了。下一篇文章中,我们就开始实现下拉刷新吧。
在上一篇中,我们将头布局加到了ListView上。但是没有隐藏他。你可能会想,隐藏还不简单,直接给它设置为GONE属性不就可以了吗,在需要的时候再设定为可见。没错,这正是ListView实现分页加载时候的做法。但是实现分页加载时,只需要上拉一下,并没有和用户过多的互动。而实现下拉刷新时,一般的做法是,用户在下拉的时候,头布局会慢慢显示,以至于有一种被拉出来的感觉。而分页加载的做法确是只要发现用户下拉,就一下子全部显示出来了。所以这种做法显然不是我们想要的效果。
那么,我们根据我们想要的效果,就不难想到,我们需要一个方法,一个可以随着用户往下拉的幅度,而让头布局也慢慢跟随显示出来的方法。在这里,采用的方法就是隐藏头布局高度的方法,即即时设置它的paddingTop。这样,刚开始直接设定paddiingTop为高度的负值,就是全部隐藏的效果,然后随着用户下拉,不断传入用户下拉的幅度作为改变paddingTop的依据,这样子头布局就会慢慢被拉出来了。
思路有了,那么问题来了。第一,要获取头布局自身的高度。第二,要编写这个方法。代码里解释的很清晰了。我们直接看下面的代码吧。对于初学者,这是很大的技巧,应该认真学习。
二、实现头布局隐藏
废话不多说,需要注意的东西在代码注释里写的很清楚了。再次编写MyListView类,如下:
package com.fuly.load; import android.content.Context; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; public class MyListView extends ListView{ private View header;//头布局 private int headerHeight;//头布局自身的高度 //三个构造方法都要重写 public MyListView(Context context) { super(context); initView( context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); initView( context); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initView( context); } public void initView(Context context){ header = LayoutInflater.from(context).inflate(R.layout.header, null); //这里需要注意,在获取高度时必须首先通知父布局header要占多大高和宽。 //因为此时父布局还不知道header的尺寸呢,否则你获取的高度只能为0. notifyView(header); headerHeight = header.getMeasuredHeight();//获取header的高度 //不能使用header.getHeight。我也不明白为什么不能使用这个方法。 //希望有人帮忙解答 // headerHeight = header.getHeight(); paddingTop(-headerHeight); //将头布局加进去 this.addHeaderView(header); } /** * 该方法为通知父布局,子布局view的宽度和高度 * @param view:子布局 */ private void notifyView(View view){ ViewGroup.LayoutParams p = view.getLayoutParams(); if(p == null){ p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); } //spec表示当前子view左右边距,padding表示子view的左右内边距 //childDimension:子view的宽度 int width = ViewGroup.getChildMeasureSpec(0, 0, p.width); int height; int tempHeight = p.height; if(tempHeight>0){ //子布局高度不为空,需要填充这个布局 height = MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.EXACTLY); }else{ //高度为0,则不需要填充 height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); } //然后告诉父布局,子布局的高度和宽度 view.measure(width, height); } //该方法设定header的paddingTop private void paddingTop(int pt){ header.setPadding(header.getPaddingLeft(), pt, header.getPaddingRight(), header.getPaddingBottom()); header.invalidate(); } }
我再强调一遍吧。在获得header自身高度的时候,由于渲染header为view的时候并没有通知父布局它有多大。因此在获取之前,需要通知父布局它要占的宽和高。否则取到的高度永远是0.
好了,运行程序,发现头布局被隐藏了。一个难啃的难题解决了。下一篇文章中,我们就开始实现下拉刷新吧。
相关文章推荐
- Linux重定向
- RDVTabBarController--可自由定制的iOS底部导航控件
- 【Android】Scrollview 顶端固定 or 滑动锚钉(续)(ScrollView里嵌套ListView)
- android ndk Support for 64-bit x86
- 2015.9.30日作业
- Linux 技巧:让进程在后台可靠运行的几种方法
- 对比度调节,亮度调节。
- Mongodb 数据模型概念
- SparkSQL相关语句总结
- Java 中StringBuffer与StringBuilder区别(转)及String类的一些基本操作代码
- 不宜深交的五类职场人
- java设计模式之单例模式
- Android开发环境搭建
- Hadoo总结二:HA高可用性原理
- easy_install,pip使用
- boost::bind的使用方法
- winform跨线程操作控件
- JSP动作标签
- 实验一 DOS命令解释程序的编写
- 后座有你