下拉刷新和上拉加载

1、视图

1)主视图

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     >
 7
 8     <com.zhyui.zdylistview.ZyhListView
 9         android:id="@+id/zyh_lv"
10         android:layout_width="match_parent"
11         android:layout_height="0dip"
12         android:layout_weight="1"
13         >
14     </com.zhyui.zdylistview.ZyhListView>
15
16 </LinearLayout>

2)头部视图

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="wrap_content"
 5     android:orientation="horizontal"
 6     >
 7     <FrameLayout
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content" >
10         <ImageView
11             android:id="@+id/iv_arr"
12             android:layout_width="wrap_content"
13             android:layout_height="wrap_content"
14             android:layout_gravity="center"
15             android:src="@drawable/ic_launcher"
16             />
17         <ProgressBar
18             android:id="@+id/pb"
19             android:layout_width="wrap_content"
20             android:layout_height="wrap_content"
21             android:layout_gravity="center"
22             style="?android:attr/progressBarStyleLarge"
23             android:visibility="invisible"
24             />
25
26     </FrameLayout>
27     <LinearLayout
28         android:layout_width="fill_parent"
29         android:layout_height="fill_parent"
30         android:orientation="vertical"
31         >
32         <TextView
33             android:id="@+id/tv_title"
34             android:layout_width="fill_parent"
35             android:layout_height="0dip"
36             android:layout_weight="2"
37             android:gravity="center"
38             android:text="下拉刷新......"
39             />
40         <TextView
41             android:id="@+id/tv_time"
42             android:layout_width="fill_parent"
43             android:layout_height="0dip"
44             android:gravity="center"
45             android:textColor="#808080"
46             android:layout_weight="1"
47             android:text="正在刷新中,时间为 2016-5-19"
48             />
49     </LinearLayout>
50 </LinearLayout>

3)底部视图

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="wrap_content"
 5     android:orientation="vertical" >
 6    <ProgressBar
 7        android:id="@+id/fpb"
 8        android:layout_width="wrap_content"
 9        android:layout_height="wrap_content"
10        android:layout_gravity="center"
11        />
12    <TextView
13        android:id="@+id/tv_load"
14        android:layout_width="wrap_content"
15        android:layout_height="wrap_content"
16        android:text="加载中......"
17        android:textColor="#ff0000"
18        android:layout_gravity="center"
19        android:textSize="18sp"
20        />
21
22 </LinearLayout>

2、MainActivity

 1 package com.zhyui.zdylistview;
 2
 3 import com.zhyui.zdylistview.ZyhListView.onRefreshListener;
 4
 5 import android.os.Bundle;
 6 import android.os.Handler;
 7 import android.widget.ArrayAdapter;
 8 import android.app.Activity;
 9
10 public class MainActivity extends Activity {
11     private ZyhListView zyh_lv;
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16         int length = 50;
17         String[] objects = new String[length];
18         for(int i=0; i<length; i++){
19             objects[i] = "abc";
20         }
21         zyh_lv = (ZyhListView) findViewById(R.id.zyh_lv);
22
23         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
24                 android.R.id.text1, objects);
25         zyh_lv.setAdapter(adapter);
26
27         zyh_lv.setOnRefreshListener(new onRefreshListener() {
28             @Override
29             public void refresh() {
30                 //向服务器请求数据
31                 new Handler(){
32                     public void handleMessage(android.os.Message msg) {
33                         zyh_lv.onRefreshComplete();
34                     };
35                 }.sendEmptyMessageDelayed(0, 3000);
36             }
37
38             @Override
39             public void loadMore() {
40                 //向服务器请求数据
41                 new Handler(){
42                     public void handleMessage(android.os.Message msg) {
43                         zyh_lv.onRefreshComplete();
44                     };
45                 }.sendEmptyMessageDelayed(0, 3000);
46             }
47         });
48     }
49
50 }

3、自定义ListView

  1 package com.zhyui.zdylistview;
  2
  3 import java.text.SimpleDateFormat;
  4 import java.util.Date;
  5
  6 import android.content.Context;
  7 import android.util.AttributeSet;
  8 import android.util.Log;
  9 import android.view.MotionEvent;
 10 import android.view.View;
 11 import android.view.animation.Animation;
 12 import android.view.animation.RotateAnimation;
 13 import android.widget.AbsListView;
 14 import android.widget.ImageView;
 15 import android.widget.ListView;
 16 import android.widget.ProgressBar;
 17 import android.widget.TextView;
 18 import android.widget.AbsListView.OnScrollListener;
 19
 20 //==================================================
 21 //1、典型应用:onRefreshListener这个接口的使用,注意它的客户端和定义端
 22 //2、下拉刷新:注意它定义的3个状态值和使用
 23 //==================================================
 24
 25 public class ZyhListView extends ListView implements OnScrollListener{
 26     private static final int STATE_PULL_REFRESH = 0;//下拉刷新状态
 27     private static final int STATE_RELESE_REFRESH = 1;//松开刷新状态
 28     private static final int STATE_REFRESHING = 2;//正在刷新中...
 29     private int mCurrentState = STATE_PULL_REFRESH;
 30     private int startY;
 31     private int endY;
 32     private int headViewHeight;
 33     private View headView;
 34     private ImageView iv_arr;
 35     private ProgressBar pb;
 36     private TextView tv_title;
 37     private TextView tv_time;
 38     private RotateAnimation rotate_up;
 39     private RotateAnimation rotate_down;
 40     public ZyhListView(Context context) {
 41         super(context);
 42         initHeadView();
 43         initFootView();
 44     }
 45
 46     public ZyhListView(Context context, AttributeSet attrs) {
 47         super(context, attrs);
 48         initHeadView();
 49         initFootView();
 50     }
 51
 52     public ZyhListView(Context context, AttributeSet attrs, int defStyle) {
 53         super(context, attrs, defStyle);
 54         initHeadView();
 55         initFootView();
 56     }
 57
 58     private void initHeadView() {
 59         headView = View.inflate(getContext(), R.layout.head, null);
 60         this.addHeaderView(headView);
 61
 62         iv_arr = (ImageView) headView.findViewById(R.id.iv_arr);
 63         pb = (ProgressBar) headView.findViewById(R.id.pb);
 64         tv_title = (TextView) headView.findViewById(R.id.tv_title);
 65         tv_time = (TextView) headView.findViewById(R.id.tv_time);
 66         tv_time.setText("最后刷新时间:" + getCurrentTime());
 67         //获取头部的高度
 68         //因为还没有对头部进行测量,所以如果不调用measure方法是得不到高度的
 69         headView.measure(0, 0);
 70         headViewHeight = headView.getMeasuredHeight();
 71         headView.setPadding(0, -headViewHeight, 0, 0);
 72
 73         //初始化动画
 74         initAnim();
 75     }
 76
 77     @Override
 78     public boolean onTouchEvent(MotionEvent ev) {
 79         switch(ev.getAction()){
 80             case MotionEvent.ACTION_DOWN:
 81                 startY = (int) ev.getRawY();
 82                 break;
 83             case MotionEvent.ACTION_MOVE:
 84                 if(startY == -1){
 85                     startY = (int) ev.getRawY();
 86                 }
 87                 endY = (int) ev.getRawY();
 88                 int des = endY - startY;
 89                 if(des > 0 && this.getFirstVisiblePosition() == 0){
 90                     Log.i("zyh", this.getVerticalScrollbarPosition()+"");
 91                     int padding = des - headViewHeight;
 92                     headView.setPadding(0, padding, 0, 0);
 93                     if(padding > 0 && mCurrentState == STATE_PULL_REFRESH){
 94                         mCurrentState = STATE_RELESE_REFRESH;//改变状态
 95                         refreshState();
 96                     }else if(padding < 0 && mCurrentState != STATE_PULL_REFRESH){
 97                         mCurrentState = STATE_PULL_REFRESH;
 98                         refreshState();
 99                     }
100                 }
101                 break;
102             case MotionEvent.ACTION_UP:
103                 startY = -1;
104                 if(mCurrentState == STATE_RELESE_REFRESH){
105                     mCurrentState = STATE_REFRESHING;
106                     refreshState();
107                     headView.setPadding(0, 0, 0, 0);
108                 }else if(mCurrentState == STATE_PULL_REFRESH){
109                     headView.setPadding(0, -headViewHeight, 0, 0);
110                 }
111                 break;
112         }
113         return super.onTouchEvent(ev);
114     }
115
116     private void refreshState() {
117         switch(mCurrentState){
118             case STATE_PULL_REFRESH:
119                 tv_title.setText("下拉刷新");
120                 iv_arr.setVisibility(View.VISIBLE);
121                 pb.setVisibility(View.INVISIBLE);
122                 iv_arr.startAnimation(rotate_down);
123                 break;
124             case STATE_RELESE_REFRESH:
125                 tv_title.setText("松开刷新");
126                 iv_arr.setVisibility(View.VISIBLE);
127                 pb.setVisibility(View.INVISIBLE);
128                 iv_arr.startAnimation(rotate_up);
129                 break;
130             case STATE_REFRESHING:
131                 tv_title.setText("正在刷新");
132                 //清楚动画,否则iv_arr是不隐藏的
133                 iv_arr.clearAnimation();
134
135                 iv_arr.setVisibility(View.INVISIBLE);
136                 pb.setVisibility(View.VISIBLE);
137                 if(mOnRefreshListener != null){
138                     mOnRefreshListener.refresh();
139                 }
140                 break;
141         }
142     }
143
144     private void initAnim() {
145         //下拉
146         rotate_up = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 0.5f,
147                 Animation.RELATIVE_TO_SELF, 0.5f);
148         rotate_up.setDuration(500);
149         rotate_up.setFillAfter(true);
150
151         //松开时
152         rotate_down = new RotateAnimation(-180, 0, Animation.RELATIVE_TO_SELF, 0.5f,
153                 Animation.RELATIVE_TO_SELF, 0.5f);
154         rotate_down.setDuration(500);
155         rotate_down.setFillAfter(true);
156
157     }
158
159     public void onRefreshComplete(){
160         if(isLoadingMore){
161             footView.setPadding(0, -footViewHeight, 0, 0);
162             isLoadingMore = false;
163         }else{
164             mCurrentState = STATE_PULL_REFRESH;
165             tv_title.setText("下拉刷新");
166             iv_arr.setVisibility(View.VISIBLE);
167             pb.setVisibility(View.INVISIBLE);
168             headView.setPadding(0, -headViewHeight, 0, 0);
169             //设置时间
170             tv_time.setText("最后刷新时间:" + getCurrentTime());
171         }
172
173     }
174     private String getCurrentTime() {
175         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
176         return sdf.format(new Date());
177     }
178     private onRefreshListener mOnRefreshListener;
179     private View footView;
180     private int footViewHeight;
181     public void setOnRefreshListener(onRefreshListener listener){
182         this.mOnRefreshListener = listener;
183     }
184     public interface onRefreshListener{
185         void refresh();
186         void loadMore();
187     }
188
189
190     private void initFootView() {
191         footView = View.inflate(getContext(), R.layout.foot, null);
192         this.addFooterView(footView);
193         footView.measure(0, 0);
194         footViewHeight = footView.getMeasuredHeight();
195         footView.setPadding(0, -footViewHeight, 0, 0);
196         //footView.setPadding(0, 0, 0, -footViewHeight);
197         this.setOnScrollListener(this);
198
199     }
200
201     private boolean isLoadingMore = false;
202     @Override
203     public void onScrollStateChanged(AbsListView view, int scrollState) {
204         //滑动后停下来,第二个是手指松开还在滑动
205         if(scrollState == SCROLL_STATE_IDLE || scrollState == SCROLL_STATE_FLING){
206             //滑到最后一个
207             if(getLastVisiblePosition() == getCount()-1 && !isLoadingMore){
208                 Log.i("zyh", "已经到最后了....");
209                 footView.setPadding(0, 0, 0, 0);
210                 setSelection(getCount()-1);
211                 isLoadingMore = true;
212
213                 if(mOnRefreshListener != null){
214                     mOnRefreshListener.loadMore();
215                 }
216             }
217         }
218     }
219
220     @Override
221     public void onScroll(AbsListView view, int firstVisibleItem,
222             int visibleItemCount, int totalItemCount) {
223         // TODO Auto-generated method stub
224
225     }
226 }
时间: 2024-08-23 13:56:47

下拉刷新和上拉加载的相关文章

支持下拉刷新和上划加载更多的自定义RecyclerView(仿XListView效果)

首先看效果 下拉刷新:        上划加载        在项目更新的过程中,遇到了一个将XListView换成recyclerView的需求,而且更换完之后大体效果不能变,但是对于下拉刷新这样的效果,谷歌给出的解决方案是把RecyclerView放在一个SwipeRefreshLayout中,但是这样其实是拉下一个小圆形控件实现的,和XListView的header效果不同.在网上找了很多的别人代码,都没有实现我想要的效果,于是自己动手写了一个. 具体实现的效果有以下几条 下拉刷新功能:

最新Android ListView 下拉刷新 上滑加载

开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,之前大家最常用的应该是pull to refresh或它的变种版吧,google官方在最新的android.support.v4包中增加了一个新类SwipeRefreshLayout,地址 这个类的作用就是提供官方的下拉刷新,并且效果相当不错,而上拉加载更多则用我们自定义的listview,也是相当简单. 下拉刷新 简单的介绍下: 首先它是一个viewgroup,但是它只允许有一个子控件,子控件能是任何view,使用的时候,所在

使用PullToRefresh实现下拉刷新和上拉加载

使用PullToRefresh实现下拉刷新和上拉加载 分类: Android2013-12-20 15:51 78158人阅读 评论(91) 收藏 举报 Android下拉刷新上拉加载PullToRefresh PullToRefresh是一套实现非常好的下拉刷新库,它支持: 1.ListView 2.ExpandableListView 3.GridView 4.WebView 等多种常用的需要刷新的View类型,而且使用起来也十分方便. (下载地址:https://github.com/ch

IOS 开发下拉刷新和上拉加载更多

IOS 开发下拉刷新和上拉加载更多 简介 1.常用的下拉刷新的实现方式 (1)UIRefreshControl (2)EGOTTableViewrefresh (3)AH3DPullRefresh (4)MJRefresh (5)自己实现 2.AH3DPullRefresh实现下拉刷新和上拉下载的步骤 添加UIScrollView+AH3DPullRefresh.h 和UIScrollView+AH3DPullRefresh.m两个文件,由此可知,它是基于UIScrollView的方法. 在bu

iOS学习之路--下拉刷新和上拉加载更多

iOS学习之路--下拉刷新和上拉加载更多 简介 本文中笔者将和大家分享应用app中常用到的表单内容的下拉刷新和上拉加载更多的功能实现的方法. 内容 1.有哪些实现方法与各方法的优劣 使用过美团,大众点评的朋友们应该有注意到,当你向上滑动表单的时候会有更多的店铺加载进你的表单中,而当你下滑表单顶的时候,则会刷新表单的内容并从网络上获取最新的信息.通过下拉刷新和上拉加载更多的功能,使app可以获取更多用户想要的信息和获取最新的信息.那么这种功能如何实现呢,还请跟着笔者继续往下看. 目前来说,主要的实

Android 使用PullToRefresh实现下拉刷新和上拉加载(ExpandableListView)

PullToRefresh是一套实现非常好的下拉刷新库,它支持: 1.ListView 2.ExpandableListView 3.GridView 4.WebView 等多种常用的需要刷新的View类型,而且使用起来也十分方便. (下载地址:https://github.com/chrisbanes/Android-PullToRefresh) 下载完成,将它导入到eclipse中,作为一个library导入到你的工程中就好了. 一.废话少说,下拉刷新Go. 1.在你的布局文件中加上你想用的

【好程序员笔记分享】——下拉刷新和上拉加载更多

-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ iOS学习之路--下拉刷新和上拉加载更多 简介 本文中笔者将和大家分享应用app中常用到的表单内容的下拉刷新和上拉加载更多的功能实现的方法. 内容 1.有哪些实现方法与各方法的优劣 使用过美团,大众点评的朋友们应该有注意到,当你向上滑动表单的时候会有更多的店铺加载进你的表单中,而当你下滑表单顶的时候,则会刷新表单的内容 并从网络上获取最新的信息.通过下拉刷新和上拉加载更多的功能,使app可以获取更多用户想要

下拉刷新和上拉加载的原理

很多App中,新闻或者展示类都存在下拉刷新和上拉加载的效果,网上提供了实现这种效果的第三方类(详情请见MJRefresh和EGOTableViewPullRefresh),用起来很方便,但是闲暇之余,我们可以思考下,这种效果实现的原理是什么,我以前说过,只要是动画都是骗人的,只要不是硬件问题大部分效果都能在系统UI的基础上做出来. @下面是关键代码分析: // 下拉刷新的原理 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scro

不借助第三方插件利用ScrollView自身delegate实现下拉刷新和上拉加载

下拉刷新功能基本上在所有的app中都会被用到,而且这个功能已经被apple集成进去了,不过必须得是在tableViewController中才有,是一个叫做UIRefreshControl的控件,想看效果可以看手机QQ上面联系人列表下拉后的刷新.这里不多介绍. 本篇blog主要介绍如何在scrollview中实现下拉刷新的效果.因为有些时候我们可能更多地希望直接在scrollview中展现,而不是一定要局限于tableviewcontroller. 当然网上有很多下拉刷新和上拉加载的第三方控件,

Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理

RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加HeaderView和FooterView,既然来到这里还没学习的,先去学习下吧. 今天我们的主题是学习为RecyclerView添加下拉刷新和上拉加载功能. 首先,我们先来学习下拉刷新,google公司已经为我们提供的一个很好的包装类,那就是SwipeRefreshLayout,这个类可以支持我们向下滑动并进