ListView自定义View上拉加载和下拉刷新的实现
该方法,我们通过完全自定义的方式实现,不添加任何依赖库和jar包。纯原生。
首先看一下我们实现的效果

实现的关键点:
- 为
ListView添加头布局和底布局。 - 通过改变头布局的
paddingTop值,来控制控件的显示和隐藏 - 根据我们滑动的状态,动态修改头部布局和底部布局。
看一下代码:
1 public class CustomRefreshListView extends ListView implements OnScrollListener{
2
3 /**
4 * 头布局
5 */
6 private View headerView;
7
8 /**
9 * 头部布局的高度
10 */
11 private int headerViewHeight;
12
13 /**
14 * 头部旋转的图片
15 */
16 private ImageView iv_arrow;
17
18 /**
19 * 头部下拉刷新时状态的描述
20 */
21 private TextView tv_state;
22
23 /**
24 * 下拉刷新时间的显示控件
25 */
26 private TextView tv_time;
27
28
29 /**
30 * 底部布局
31 */
32 private View footerView;
33
34 /**
35 * 底部旋转progressbar
36 */
37 private ProgressBar pb_rotate;
38
39
40 /**
41 * 底部布局的高度
42 */
43 private int footerViewHeight;
44
45
46 /**
47 * 按下时的Y坐标
48 */
49 private int downY;
50
51 private final int PULL_REFRESH = 0;//下拉刷新的状态
52 private final int RELEASE_REFRESH = 1;//松开刷新的状态
53 private final int REFRESHING = 2;//正在刷新的状态
54
55 /**
56 * 当前下拉刷新处于的状态
57 */
58 private int currentState = PULL_REFRESH;
59
60 /**
61 * 头部布局在下拉刷新改变时,图标的动画
62 */
63 private RotateAnimation upAnimation,downAnimation;
64
65 /**
66 * 当前是否在加载数据
67 */
68 private boolean isLoadingMore = false;
69
70 public CustomRefreshListView(Context context) {
71 this(context,null);
72 }
73
74 public CustomRefreshListView(Context context, AttributeSet attrs) {
75 super(context, attrs);
76 init();
77 }
78
79 private void init(){
80 //设置滑动监听
81 setOnScrollListener(this);
82 //初始化头布局
83 initHeaderView();
84 //初始化头布局中图标的旋转动画
85 initRotateAnimation();
86 //初始化为尾布局
87 initFooterView();
88 }
89
90
91 /**
92 * 初始化headerView
93 */
94 private void initHeaderView() {
95 headerView = View.inflate(getContext(), R.layout.head_custom_listview, null);
96 iv_arrow = (ImageView) headerView.findViewById(R.id.iv_arrow);
97 pb_rotate = (ProgressBar) headerView.findViewById(R.id.pb_rotate);
98 tv_state = (TextView) headerView.findViewById(R.id.tv_state);
99 tv_time = (TextView) headerView.findViewById(R.id.tv_time);
100
101 //测量headView的高度
102 headerView.measure(0, 0);
103 //获取高度,并保存
104 headerViewHeight = headerView.getMeasuredHeight();
105 //设置paddingTop = -headerViewHeight;这样,该控件被隐藏
106 headerView.setPadding(0, -headerViewHeight, 0, 0);
107

