ListView实现下拉刷新(二)隐藏头布局
一、问题分析
在上一篇中,我们将头布局加到了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.
好了,运行程序,发现头布局被隐藏了。一个难啃的难题解决了。下一篇文章中,我们就开始实现下拉刷新吧。
ListView实现下拉刷新(二)隐藏头布局的更多相关文章
- ListView实现下拉刷新(一)建立头布局
一.效果演示 ListView实现下拉刷新,是很常见的功能.下面是一个模拟的效果,如下图: 效果说明:当往下拉ListView的时候 ...
- ListView实现下拉刷新(三)实现下拉刷新
该准备的东西都已经准备好了.在这篇文章里,我们就开始实现下拉刷新功能吧. 一.大体的逻辑分析 我们来简单分析一下需要做的逻辑吧.首先分析头布局有几种状态.不下拉时,为正常状态,此时头布局隐藏.下拉到一 ...
- Android UI--自定义ListView(实现下拉刷新+加载更多)
Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就 ...
- Android开发 - 下拉刷新和分段头悬停列表
项目源码 本文所述项目已开源,源码地址 为什么做PullToRefresh-PinnedSection-ListView 前段时间因为项目需求,需要在Android中对ListView同时增加下拉刷新 ...
- android--------自定义控件ListView实现下拉刷新和上拉加载
开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,为了方便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能. Android下拉刷新可以分为两种情况: 1.获取 ...
- ListView实现下拉刷新和上拉加载功能
1 public class RefreshListView extends ListView implements OnScrollListener { private View mHeaderVi ...
- 自定义ListView实现下拉刷新,下拉加载的功能
package com.loaderman.myrefreshlistviewdemo; import android.content.Context; import android.util.Att ...
- 【转载】 Android PullToRefresh (ListView GridView 下拉刷新) 使用详解
Android下拉刷新pullToRefreshListViewGridView 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/3 ...
- Android PullToRefresh (ListView GridView 下拉刷新) 使用详解
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:[张鸿洋的博客] 群里一哥们今天聊天偶然提到这个git ...
随机推荐
- OGNL与值栈
一.OGNL入门 1.什么是OGNL OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言.使用这种表达式语言,可以通过 ...
- [PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法
问题 怎样找出一个序列中出现次数最多的元素呢? 解决方案 collections.Counter 类就是专门为这类问题而设计的, 它甚至有一个有用的 most_common() 方法直接给了你答案 c ...
- [PY3]——heap模块 和 堆排序
heapify( ) heapify()函数用于将一个序列转化为初始化堆 nums=[16,7,3,20,17,8,-1] print('nums:',nums) show_tree(nums) nu ...
- wtl学习总结
在windows平台,相比MFC,我更喜欢WTL,因其简洁漂亮.所以陆续花了一年的时间学习之,这里总结一下(在学习Wtl/Atl之前,最好是对WinApi编程有一定的了解). 安装 Wtl主页 htt ...
- .netCore2.0 程序集DI依赖注入
传统的依赖注入确实简单,但是随着项目的扩展随之而来的问题又来了,因为传统的注入是单个类和接口注入的,加入项目的接口和类增加到了上百个的话,就需要在Startup.cs中复制注入上百次,虽然能解决问题, ...
- Ms SQL Server 游标嵌套 初始化数据
--TRUNCATE TABLE TAB_ROLE_FUNC; --SELECT * FROM TAB_ROLE_FUNC; ), ; --外层游标 DECLARE CURSOR_ROLE CURSO ...
- jquery 使用整理机制
短路表达式 与 多重短路表达式 短路表达式这个应该人所皆知了.在 jQuery 中,大量的使用了短路表达式与多重短路表达式. 短路表达式:作为"&&"和" ...
- centos下不重装php——给PHP添加新扩展库
装完php.发现需要一些新扩展库比如常见的mysqli之类的.在不重装php安装新扩展,以一个不常用的库xsl为例. 环境:centos6.8,php5.3.29 ,osx10.11.6 我的php相 ...
- MySQL的四种事务隔离级别【转】
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做 ...
- Java使用反射来获取成员变量泛型信息
Java通过指定类对应的Class对象,程序可以获得该类里包括的所有Field,不管该Field使用private修饰,还是使用public修饰.获得了Field对象后,就可以很容易的获得该Field ...