ListView实现下拉刷新-2-将顶部布局加载到ListView中

上一篇实现了Adapter类的创建,和getView函数的分析;

这一篇主要讲第二部分,即将顶部布局加载到ListView中;重点是ReFlashListView的实现上,这一篇中我会谈一谈在阅读源代码的过程中所遇到的困难和采取的方法;

首先看ReFlashListView类:

public class ReFlashListView extends ListView implements OnScrollListener

表明ReFlashListView是继承自ListView的,并且 实现了OnScrollListener接口:

继承自ListView:如何进行构造方法的添加呢?我在包下又创建了一个MyListView类,进行了以下两种方法的实现:

方法1:将ListView的包导入后,鼠标移动到MyListView下,之后就会出现三种构造方法,可以点击添加;

方法2:右击->Source->Generate Constructors from Superclass,在窗口中选择Select All,点击ok;

这两种方法:方法一虽然比较简单,但是只能添加一个。方法二比较复杂,但是可以添加多个。所以推荐使用方法二;

实现了OnScrollListener接口:按住ctrl+右键,进入OnScrollListener接口的定义位置,发现他是定义在AbsListView$OnScrolListener.java文件中,在里面声明的常量和函数有:

 public interface OnScrollListener {

        public static int SCROLL_STATE_IDLE = 0

        public static int SCROLL_STATE_TOUCH_SCROLL = 1;

        public static int SCROLL_STATE_FLING = 2;

        public void onScrollStateChanged(AbsListView view, int scrollState);

        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,

                int totalItemCount);

    }

在导入OnScrollListener的包后,鼠标移动到我们的实验类MyListView下,之后点击Add unimplemented methods;就为类添加了onScrollStateChanged和onScroll这两者函数了;

有关于ReFlashListView的继承关系与接口实现讨论结束之后,接下来我们将讨论各个成员函数的作用,并在这个过程中,获得ReFlashListView类的成员变量;最后再将成员变量和其所起的作用,总结给出(毕竟我们并不是一开始就知道需要什么成员变量,只有在写函数的时候才在开始的位置补充上的)。

首先给出各个函数的声明:

private void initView(Context context)

private void measureView(View view)

private void topPadding(int topPadding)

public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount)

public void onScrollStateChanged(AbsListView view, int scrollState)

public boolean onTouchEvent(MotionEvent ev)

private void onMove(MotionEvent ev)

private void reflashViewByState()

public void reflashComplete()

public void setInterface(IReflashListener iReflashListener)

public interface IReflashListener

各个函数的作用:

initView:初始化界面,添加顶部布局文件到 listview

measureView:通知父布局,占用的宽,高;

topPadding:设置header布局上边距;

onScroll:获取到当前可见的第一个的编号;

onScrollStateChanged:获得listview 当前滚动状态;

onTouchEvent:获得手势;

onMove:根据手势,来改变view的显示;

reflashViewByState:根据当前状态,改变界面显示;

reflashComplete:获取完数据;

setInterface:设置监听器,主要是接口回调机制中起作用;

在initView函数中:

private void initView(Context context) {

        LayoutInflater inflater = LayoutInflater.from(context); ///获得context的Inflater;

        header = inflater.inflate(R.layout.header_layout, null);///为xml文件创建一个View对象;

        measureView(header);  ///获得高度

        headerHeight = header.getMeasuredHeight();///测量高度

        Log.i("tag""headerHeight = " + headerHeight);

        topPadding(-headerHeight);

        this.addHeaderView(header);    ///添加顶部view

        this.setOnScrollListener(this);

    }

Inflater类的作用主要是连接xml与VIew对象的,具体的话可以看我的博客:常用但忽略的android知识1-Inflate

heade是View类型,属于类的成员变量,用来记录顶部布局;

为什么要用measureView函数来获得高度的原因是:在onCreate()里面获取控件的高度是0,ReFlashListView实例化的时候正好是在onCreate函数中的,具体的话可以看我的博客:常用但忽略的anroid知识5-获得一个view的宽和高

之后调用topPadding函数来设置高度,从而达到隐藏的目的;

ListView的成员函数addHeaderView,可以用来为ListView加载顶部布局;

最后setOnScrollListener设置监听器,自动调用onScroll,onScrollStateChanged这两个函数。

在measureView函数中:

private void measureView(View view) {

        ViewGroup.LayoutParams p = view.getLayoutParams();

        if (p == null) {

            p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,

                    ViewGroup.LayoutParams.WRAP_CONTENT);

        }

        int width = ViewGroup.getChildMeasureSpec(00, p.width);

        int height;

        int tempHeight = p.height;

        if (tempHeight > 0) {

            height = MeasureSpec.makeMeasureSpec(tempHeight,

                    MeasureSpec.EXACTLY);

        else {

            height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);

        }

        view.measure(width, height);

    }

ViewGroup.LayoutParams这个在代码中的解释是:LayoutParams are used by views to tell their parents how they want to be laid out.也就是获得view的大小;

MeasureSpec这个在代码中的解释是:A MeasureSpec encapsulates the layout requirements passed from parent to child. Each MeasureSpec represents a requirement for either the width or the height. A MeasureSpec is comprised of a size and a mode.

注意到在课程的回复区:有大神是这样说的"测量子 view 的时候根本不用这么麻烦,既然没有按照 android view 系统的标准流程走,在 onMeasure 的时候测量,而提前在构造函数的时候就测量,其实只需要高,所以只需要

p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,

ViewGroup.LayoutParams.WRAP_CONTENT);

height = MeasureSpec.makeMeasureSpec(tempHeight,MeasureSpec.AT_MOST);

view.measure(width, height);

就行啦,宽随便设置一个值就行嘛,反正也不使用的。"

在topPadding函数中:

private void topPadding(int topPadding) {

        header.setPadding(header.getPaddingLeft(), topPadding,

                header.getPaddingRight(), header.getPaddingBottom());

        header.invalidate(); 

    }

需要注意invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面;

通过上面的这几个函数,大致的Head顶部布局就被加载到ListView中了,并被隐藏;

下一篇我们将主要讨论状态的改变,和下拉刷新的实现。

时间: 2024-10-27 03:30:42

ListView实现下拉刷新-2-将顶部布局加载到ListView中的相关文章

JRoll 2 使用文档(史上最强大的下拉刷新,滚动,无限加载插件)

概述 说明 JRoll,一款能滚起上万条数据,具有滑动加速.回弹.缩放.滚动条.滑动事件等功能,兼容CommonJS/AMD/CMD模块规范,开源,免费的轻量级html5滚动插件. JRoll第二版是在JRoll第一版基础上重写JRoll滑动算法,基于时间运动,解决帧频降低时滑动缓慢的问题,更改垂直水平方向判断方法,使捕获垂直水平方向更准确灵敏. JRoll第二版增减了一些api不完全兼容JRoll第一版. 先睹为快 http://www.chjtx.com/JRoll/demos/ 运行示例

ListView实现下拉刷新-3-将顶部布局动态的显示出来

在第二篇中主要讨论了将顶部布局加载到ListView中,重点分析了init,measureView和topping三个方法的实现: 这一篇主要是收尾部分,即判断状态,加载相应的函数并实现函数回调机制: onTouchEvent:判断手势动作的方法: public boolean onTouchEvent(MotionEvent ev) {          // TODO Auto-generated method stub          switch (ev.getAction()) {

ListView实现下拉刷新-1-实现ListView

即使你不是需要这个项目,但通过这个项目,你会知道android的一些基础知识,对初学者的话帮助会比较大! ListView做下拉刷新的源码为例,代码是有慕课网的老师提供的,真心感谢慕课网! 源码下载   (注意源码中,有两个类He,MyAdapter是为了测试而创建的,没有实际作用) 不是打广告(注意在边看解释的时候最好是边看代码) 综述:(分多篇的原因是:一起讲完的话,不一定能接受,而不是故意为了积分) 第一篇:实现LIstView:重点在MyAdapter的实现上和convertView回收

Android listview的下拉刷新

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">好久没有写博客了,今天我就写一个listview的下拉刷新分享给大家,希望对大家学习或者工作上有所帮助,其实呢,大家都知道,在现在的app当中,下拉刷新是比较常用的功能,用到的地方太多了,所以,今天我也就结合自己的思想给家真理一下,那么好,接下来,让我们一起学习,让你分分钟写出自己想要的

Android自定义控件——ListView的下拉刷新与上拉加载

转载请注明出处:http://blog.csdn.net/allen315410/article/details/39965327 1.简介 无疑,在Android开发中,ListView是使用非常频繁的控件之一,ListView提供一个列表的容易,允许我们以列表的形式将数据展示到界面上,但是Google给我们提供的原生ListView的控件,虽然在功能上很强大,但是在用户体验和动态效果上,还是比较差劲的.为了改善用户体验,市面上纷纷出现了各种各样的自定义的ListView,他们功能强大,界面美

android 安卓自定义listview实现下拉刷新

[1].重写listView public class MyListView extends ListView implements OnScrollListener {          private final static int RELEASE_To_REFRESH = 0;// 下拉过程的状态值       private final static int PULL_To_REFRESH = 1; // 从下拉返回到不刷新的状态值       private final static

Android UI--自定义ListView(实现下拉刷新+加载更多)

http://blog.csdn.net/wwj_748/article/details/12512885 Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就是不健全的.因为小巫近期要开发新浪微博客户端,需要实现ListView的下拉刷新,所以就想把这个UI整合到项目当中去,这里只是一个demo,可以根据项目的需要进行修改. 就不要太在乎界面了哈:

ListView实现下拉刷新(一)建立头布局

一.效果演示 ListView实现下拉刷新,是很常见的功能.下面是一个模拟的效果,如下图:                                   效果说明:当往下拉ListView的时候,顶部就会有一个“下拉刷新”的标识被拉 出来,再往下拉的时候,标识就会变成”松开刷新“,期间还伴随一个箭头的变化.此时松开手指,则会变成进度条提示正在刷新,刷新完成后,则加载进来刷新的数据.如此反复,就是下拉刷新的功能. 二.准备Demo 其实本质上,ListView实现下拉刷新和实现分页加载都是一

ListView的下拉刷新上拉加载以及带列的横向滚动

相信有很人做的项目估计都用的到这个.就是ListView的下拉刷新上拉加载还有就是列的横向滚动; PS:横向滚动带表头与固定列(相信蛮多人都有这样的需求吧?就是在ListView上支持很多列,然而设备屏幕宽度有限) PS:这是我个人在网上找的两个示例demo结合而成的一个示例demo,还可以继续拓展,后续有时间就会更新,大家互相学习 ListView下拉刷新上拉加载示例demo原文出处: http://blog.csdn.net/limb99/article/details/18901513 L