Android之XListView下拉刷新,更新网络美女图
1、setOnRefreshListener(OnRefreshListener listener) 设置下拉监听,当用户下拉的时候会去执行回调
2、setColorSchemeColors(int... colors) 设置 进度条的颜色变化,最多可以设置4种颜色
3、setProgressViewOffset(boolean scale, int start, int end) 调整进度条距离屏幕顶部的距离
4、setRefreshing(boolean refreshing) 设置SwipeRefreshLayout当前是否处于刷新状态,一般是在请求数据的时候设置为true,在数据被加载到View中后,设置为false。






x.http().get(new RequestParams(url), new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
imageListAdapter.addSrc(getImgSrcList(result));
imageListAdapter.notifyDataSetChanged();//通知listview更新数据
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
绑定图片,代码如下:
x.image().bind(holder.imgItem,
imgSrcList.get(position),
imageOptions,
new CustomBitmapLoadCallBack(holder));

红色框内的需要拿来用
可知<me.maxwin.view.XListView ......></me.maxwin.view.XListView> 所以需要把<ListView ..... />替换掉
mListViewListener = l;
}
* implements this interface to get refresh/load more event.
*/
public interface IXListViewListener {
public void onRefresh();
public void onLoadMore();
}
三、XListView源码分析
public class XListView extends ListView implements OnScrollListener{
......
//上拉加载更多,将一些控件显示出来,例如ProgressBar,文本的设置,没什么好分析的,只分析下拉刷新
/**
* stop refresh, reset header view.
*/
public void stopRefresh() {
if (mPullRefreshing == true) {
mPullRefreshing = false;
resetHeaderHeight();
}
}
private void resetHeaderHeight() {
//向下滑动的高度
int height = mHeaderView.getVisiableHeight();
if (height == 0) // 没滑动时,不做任何操作
return;
//滑动的高度小于header view's height,不做任何操作
if (mPullRefreshing && height <= mHeaderViewHeight) {
return;
}
int finalHeight = 0; //若滑动后不做任何操作,值为0 否则为mHeaderViewHeight
// 滑动的高度大于header view's height,设置finalHeight
if (mPullRefreshing && height > mHeaderViewHeight) {
finalHeight = mHeaderViewHeight;
}
mScrollBack = SCROLLBACK_HEADER;
/**
* 第一个参数是起始移动的x坐标值,第二个是起始移动的y坐标值
第三及第四个参数都是移到某点的坐标值,duration 是执行移动的时间
*/
mScroller.startScroll(0, height, 0, finalHeight - height,
SCROLL_DURATION);
// 触发computeScroll()
/**
* public void computeScroll ()
Called by a parent to request that a child update its values for mScrollX and
mScrollY if necessary. This will typically be done if the child is animating
a scroll using a Scroller object.
*/
//ontouch或invalidate()或postInvalidate()都会导致computeScroll()的执行
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (mLastY == -1) {
mLastY = ev.getRawY();
}
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//获取刚触碰的Y高度(原始的)
mLastY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
final float deltaY = ev.getRawY() - mLastY;
mLastY = ev.getRawY();
//getFirstVisiblePosition获取当前状态下list的第一个可见item的position
//所以在listview中position总的加了1,获取准确的需要get(position - 1)
if (getFirstVisiblePosition() == 0
&& (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {
// 第一项是显示,下拉箭头显示或拉下来
//类似于iOS下拉特性 deltaY / OFFSET_RADIO
updateHeaderHeight(deltaY / OFFSET_RADIO);
invokeOnScrolling();
} else if (getLastVisiblePosition() == mTotalItemCount - 1
&& (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {
// 最后一个item,上拉有效
updateFooterHeight(-deltaY / OFFSET_RADIO);
}
break;
default:
mLastY = -1; // 重置
if (getFirstVisiblePosition() == 0) {
// 调用刷新
if (mEnablePullRefresh
&& mHeaderView.getVisiableHeight() > mHeaderViewHeight) {
mPullRefreshing = true;
mHeaderView.setState(XListViewHeader.STATE_REFRESHING);
if (mListViewListener != null) {
mListViewListener.onRefresh();
}
}
resetHeaderHeight();
} else if (getLastVisiblePosition() == mTotalItemCount - 1) {
// 调用加载更多
if (mEnablePullLoad
&& mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA
&& !mPullLoading) {
startLoadMore();
}
resetFooterHeight();
}
break;
}
return super.onTouchEvent(ev);
}
// startScroll执行过程中即在duration时间内,computeScrollOffset 方法会一直返回false,但当动画执行完成后会返回返加true.
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
//如果执行过下拉刷新则 mScrollBack == SCROLLBACK_HEADER
if (mScrollBack == SCROLLBACK_HEADER) {
mHeaderView.setVisiableHeight(mScroller.getCurrY());
} else {
mFooterView.setBottomMargin(mScroller.getCurrY());
}
//类似于invalidate(),用于刷新view,主要在非UI线程中使用
postInvalidate();
//回滚监听
invokeOnScrolling();
}
super.computeScroll();
}
......
}
public class XListViewHeader extends LinearLayout {
......
//旋转动画
/**
* RotateAnimation (float fromDegrees, float toDegrees, int pivotXType,
* float pivotXValue, int pivotYType, float pivotYValue)
参数说明:
float fromDegrees:旋转的开始角度。
float toDegrees:旋转的结束角度。
int pivotXType:X轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotXValue:X坐标的伸缩值。
int pivotYType:Y轴的伸缩模式,可以取值为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。
float pivotYValue:Y坐标的伸缩值。
*/
mRotateUpAnim = new RotateAnimation(0.0f, -180.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
//设置动画持续时间
mRotateUpAnim.setDuration(ROTATE_ANIM_DURATION);
//动画执行完后是否停留在执行完的状态
mRotateUpAnim.setFillAfter(true);
mRotateDownAnim = new RotateAnimation(-180.0f, 0.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
mRotateDownAnim.setDuration(ROTATE_ANIM_DURATION);
mRotateDownAnim.setFillAfter(true);
......
}
Android之XListView下拉刷新,更新网络美女图的更多相关文章
- Android 使用官方下拉刷新
网上关于下拉刷新的文章也不少,不过都太长了,看得挺难受的.恰好发现了官方的下拉刷新库,而且效果还是不错的,简洁美观,用得也挺方便. 下面是效果图: 我的好友原来是空的,刷新后多了两个. 使用还是挺方便 ...
- Android XListView下拉刷新、上拉载入更多
source code: https://github.com/Maxwin-z/XListView-Android 提供了两个接口: a) IXListViewListener: 触发下拉刷新.上 ...
- 【转载】Android中ListView下拉刷新的实现
在网上看到一个下拉刷新的例子,很的很棒,转载和更多的人分享学习 原文:http://blog.csdn.net/loongggdroid/article/details/9385535 ListVie ...
- Android中ListView下拉刷新的实现
ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考.那我就不解释,直接上代码了. 这里需要自己重写一下ListView,重写代码如下: packa ...
- Android中实现下拉刷新
需求:项目中的消息列表界面要求实现类似sina微博的下拉刷新: 思路:一般的消息列表为ListView类型,将list加载到adapter中,再将adapter加载到 ListView中,从而实现消息 ...
- Android之自定义控件-下拉刷新
实现效果: 图片素材: --> 首先, 写先下拉刷新时的刷新布局 pull_to_refresh.xml: <resources> <string name=& ...
- Android SwipeRefreshLayout 官方下拉刷新控件介绍
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 下面App基本都有下拉刷新的功能,以前基本都使用XListView ...
- Android内置下拉刷新组件SwipeRefreshLayout
也许下拉刷新之前,你可能会使用一些第三方的开源库,例如PullToRefresh, ActionBar-PullToRefresh等待,但现在有的正式组成部分---SwipeRefreshLayout ...
- XListView下拉刷新和上拉加载更多详解
转载本专栏每一篇博客请注明转载出处地址,尊重原创.博客链接地址:小杨的博客 http://blog.csdn.net/qq_32059827/article/details/53167655 市面上有 ...
随机推荐
- C++ 头文件系列(unordered_map、unordered_set)
简介 很明显,这两个头文件分别是map.set头文件对应的unordered版本. 所以它们有一个重要的性质就是: 乱序 如何乱序 这个unorder暗示着,这两个头文件中类的底层实现----Hash ...
- 内功心法 -- java.util.ArrayList<E> (6)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- WebServerice
WebServerice是什么 web service是一个web应用程序的分支,是构建应用程序的普通模型,可以在支持Internet网络通信操作系统上实施. 它的原理主要是利用HTTP协议使数据在w ...
- Python单元测试——深入理解unittest
单元测试的重要性就不多说了,可恶的是python中有太多的单元测试框架和工具,什么unittest, testtools, subunit, coverage, testrepository, nos ...
- Spring 中使用Quartz实现任务调度
前言:Spring中使用Quartz 有两种方式,一种是继承特定的基类:org.springframework.scheduling.quartz.QuartzJobBean,另一种则不需要,(推荐使 ...
- 用《内网穿山甲》把本地IIS中的站点共享到远程访问
前言: 因为各种原因,我们常常要把本机或局域网中搭建的站点发给远方的人访问,他有可能是测试人员.客户.前端.或领导演示,或是内部系统内部论坛临时需要在远程访问,事件变得很麻烦,要么有公网IP,要么能控 ...
- jQuery_第三章_工厂函数
- shell-3
每天学习一篇:利用跑代码或者空闲思考时间,启动环境时间等闲杂时间: http://blog.csdn.net/junjieguo/article/category/880326/2
- ant编译java的例子
ant hello world 建一上文件夹HelloWorld.里面的内容如下所示: 第一个例子不讨论build1.xml和HelloWorld1.java.运行出helloworld程序要如下步骤 ...
- 第一章 Java语言概述2
一.编写第一个Java应用程序 1.下载.安装JDK 官方网址:www.oracle.com java.sun.com 安装JDK 傻瓜式安装,下一步即可. 建议:安装路径不要有中文或者特殊符号,如空 ...