Android 自定义ListView实现底部分页刷新与顶部下拉刷新

迈不过友情╰ 2022-08-13 19:35 255阅读 0赞

在项目开发中,由于数据过大时,需要进行分页加载或下拉刷新,来缓解一次性加载的过长等待。本篇博文实例讲解通过自定义的ListView实现底部分页加载和顶部下拉刷新的效果。

其效果图:

20141111230403763

一.ListView 底部分页加载

整个底部分页加载,主要分一下几步:

1.加载底部自定义View;

2.响应OnScrollListener监听事件,onScroll方法记录最后可见的View Item以及整个totalItemCount。当onScrollStateChanged状态改变时,

当滑动到底端,并滑动状态为 SCROLL_STATE_IDLE,显示底部加载View,开始实现自定义加载接口;

3.当数据加载完成时,隐藏底部下拉View.

自定义底部下拉加载PaginationListView代码如下:

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.paginationrefreshlistdemo.listview;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.widget.AbsListView;
  7. import android.widget.AbsListView.OnScrollListener;
  8. import android.widget.ListView;
  9. import com.example.paginationrefreshlistdemo.R;
  10. public class PaginationListView extends ListView implements OnScrollListener{
  11. //底部View
  12. private View footerView;
  13. //ListView item个数
  14. int totalItemCount = 0;
  15. //最后可见的Item
  16. int lastVisibleItem = 0;
  17. //是否加载标示
  18. boolean isLoading = false;
  19. public PaginationListView(Context context) {
  20. super(context);
  21. initView(context);
  22. }
  23. public PaginationListView(Context context, AttributeSet attrs) {
  24. super(context, attrs);
  25. initView(context);
  26. }
  27. public PaginationListView(Context context, AttributeSet attrs, int defStyle) {
  28. super(context, attrs, defStyle);
  29. initView(context);
  30. }
  31. /**
  32. * 初始化ListView
  33. */
  34. private void initView(Context context){
  35. LayoutInflater mInflater = LayoutInflater.from(context);
  36. footerView = mInflater.inflate(R.layout.footer, null);
  37. footerView.setVisibility(View.GONE);
  38. this.setOnScrollListener(this);
  39. //添加底部View
  40. this.addFooterView(footerView);
  41. }
  42. @Override
  43. public void onScrollStateChanged(AbsListView view, int scrollState) {
  44. //当滑动到底端,并滑动状态为 not scrolling
  45. if(lastVisibleItem == totalItemCount && scrollState == SCROLL_STATE_IDLE){
  46. if(!isLoading){
  47. isLoading = true;
  48. //设置可见
  49. footerView.setVisibility(View.VISIBLE);
  50. //加载数据
  51. onLoadListener.onLoad();
  52. }
  53. }
  54. }
  55. @Override
  56. public void onScroll(AbsListView view, int firstVisibleItem,
  57. int visibleItemCount, int totalItemCount) {
  58. this.lastVisibleItem = firstVisibleItem + visibleItemCount;
  59. this.totalItemCount = totalItemCount;
  60. }
  61. private OnLoadListener onLoadListener;
  62. public void setOnLoadListener(OnLoadListener onLoadListener){
  63. this.onLoadListener = onLoadListener;
  64. }
  65. /**
  66. * 加载数据接口
  67. * @author Administrator
  68. *
  69. */
  70. public interface OnLoadListener{
  71. void onLoad();
  72. }
  73. /**
  74. * 数据加载完成
  75. */
  76. public void loadComplete(){
  77. footerView.setVisibility(View.GONE);
  78. isLoading = false;
  79. this.invalidate();
  80. }
  81. }
  82. </span>

底部下拉加载布局footer.xml

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:id="@+id/footer_ll"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. android:gravity="center"
  7. android:orientation="horizontal" >
  8. <ProgressBar
  9. android:id="@+id/progress"
  10. style="?android:attr/progressBarStyleSmall"
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:layout_marginBottom="30dp"
  14. android:layout_marginTop="30dp" />
  15. <TextView
  16. android:id="@+id/tv"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:layout_marginLeft="20dp"
  20. android:text="正在加载..."
  21. android:textColor="#FF0000" />
  22. </LinearLayout></span>

二.ListView顶部下拉刷新

数据顶部下拉刷新的步骤如下:

1.加载顶部自定义View,通过设置View的边距来显示和隐藏View;

2.通过OnScrollListener监听事件,获取ListView的活动状态以及firstVisibleItem首位可见的Item;

3.通过OnTouchListener监听事件,通过判断是否在首位,以及处理ACTION_DOWN,ACTION_MOVE,ACTION_UP

各个状态事件,并记录none(正常),pull(下拉),release(释放),reflashing(刷新)等状态。

ACTION_DOWN:判断是否在首列,若是,记录该点位置startY;

ACTION_MOVE:记录移动后的tempY,获取间距space,与View的高度比较后,动态获取View上边距,并设置。

ACTION_UP:记录为reflashing状态,刷新数据

4.刷新完成后,还原各自所处状态,隐藏View。

顶部下拉刷新自定义ReflashListVIew

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.paginationrefreshlistdemo.listview;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import android.annotation.SuppressLint;
  5. import android.content.Context;
  6. import android.util.AttributeSet;
  7. import android.view.LayoutInflater;
  8. import android.view.MotionEvent;
  9. import android.view.View;
  10. import android.view.ViewGroup;
  11. import android.view.animation.RotateAnimation;
  12. import android.widget.AbsListView;
  13. import android.widget.ImageView;
  14. import android.widget.ProgressBar;
  15. import android.widget.TextView;
  16. import android.widget.AbsListView.OnScrollListener;
  17. import android.widget.ListView;
  18. import com.example.paginationrefreshlistdemo.R;
  19. public class RefreshListView extends ListView implements OnScrollListener{
  20. //顶部View
  21. private View topView;
  22. //第一个可见View
  23. int firstVisibleItem;
  24. //顶部View的高度
  25. int headerHeight;
  26. // listview 当前滚动状态;
  27. int scrollState;
  28. // 标记,当前是在listview最顶端摁下的;
  29. boolean isRefresh;
  30. // 摁下时的Y值;
  31. int startY;
  32. int state;// 当前的状态;
  33. final int NONE = 0;// 正常状态;
  34. final int PULL = 1;// 提示下拉状态;
  35. final int RELESE = 2;// 提示释放状态;
  36. final int REFLASHING = 3;// 刷新状态;
  37. public RefreshListView(Context context) {
  38. super(context);
  39. initView(context);
  40. }
  41. public RefreshListView(Context context, AttributeSet attrs) {
  42. super(context, attrs);
  43. initView(context);
  44. }
  45. public RefreshListView(Context context, AttributeSet attrs, int defStyle) {
  46. super(context, attrs, defStyle);
  47. initView(context);
  48. }
  49. /**
  50. * 初始化ListView
  51. */
  52. private void initView(Context context){
  53. LayoutInflater mInflater = LayoutInflater.from(context);
  54. topView = mInflater.inflate(R.layout.top, null);
  55. measureView(topView);
  56. headerHeight = topView.getMeasuredHeight();
  57. //初始状态设置隐藏
  58. topPadding(-headerHeight);
  59. this.setOnScrollListener(this);
  60. this.addHeaderView(topView);
  61. }
  62. @Override
  63. public void onScrollStateChanged(AbsListView view, int scrollState) {
  64. //当滑动到底端,并滑动状态为 not scrolling
  65. this.scrollState = scrollState;
  66. }
  67. /**
  68. * 通知父布局,占用的宽,高;
  69. *
  70. * @param view
  71. */
  72. private void measureView(View view) {
  73. ViewGroup.LayoutParams p = view.getLayoutParams();
  74. if (p == null) {
  75. p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
  76. ViewGroup.LayoutParams.WRAP_CONTENT);
  77. }
  78. int width = ViewGroup.getChildMeasureSpec(0, 0, p.width);
  79. int height;
  80. int tempHeight = p.height;
  81. if (tempHeight > 0) {
  82. height = MeasureSpec.makeMeasureSpec(tempHeight,
  83. MeasureSpec.EXACTLY);
  84. } else {
  85. height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
  86. }
  87. view.measure(width, height);
  88. }
  89. /**
  90. * 设置header 布局 上边距;
  91. *
  92. * @param topPadding
  93. */
  94. private void topPadding(int topPadding) {
  95. topView.setPadding(topView.getPaddingLeft(), topPadding,
  96. topView.getPaddingRight(), topView.getPaddingBottom());
  97. topView.invalidate();
  98. }
  99. @Override
  100. public void onScroll(AbsListView view, int firstVisibleItem,
  101. int visibleItemCount, int totalItemCount) {
  102. this.firstVisibleItem = firstVisibleItem ;
  103. }
  104. @Override
  105. public boolean onTouchEvent(MotionEvent ev) {
  106. // TODO Auto-generated method stub
  107. switch (ev.getAction()) {
  108. //往下
  109. case MotionEvent.ACTION_DOWN:
  110. if (firstVisibleItem == 0) {
  111. isRefresh = true;
  112. startY = (int) ev.getY();
  113. }
  114. break;
  115. //移动
  116. case MotionEvent.ACTION_MOVE:
  117. onMove(ev);
  118. break;
  119. //向上
  120. case MotionEvent.ACTION_UP:
  121. if (state == RELESE) {
  122. state = REFLASHING;
  123. // 加载最新数据;
  124. reflashViewByState();
  125. onRefreshListener.onRefresh();
  126. } else if (state == PULL) {
  127. state = NONE;
  128. isRefresh = false;
  129. reflashViewByState();
  130. }
  131. break;
  132. }
  133. return super.onTouchEvent(ev);
  134. }
  135. /**
  136. * 判断移动过程操作;
  137. *
  138. * @param ev
  139. */
  140. private void onMove(MotionEvent ev) {
  141. if (!isRefresh) {
  142. return;
  143. }
  144. int tempY = (int) ev.getY();
  145. int space = tempY - startY;
  146. int topPadding = space - headerHeight;
  147. switch (state) {
  148. case NONE:
  149. if (space > 0) {
  150. state = PULL;
  151. reflashViewByState();
  152. }
  153. break;
  154. case PULL:
  155. topPadding(topPadding);
  156. if (space > headerHeight + 30
  157. && scrollState == SCROLL_STATE_TOUCH_SCROLL) {
  158. state = RELESE;
  159. reflashViewByState();
  160. }
  161. break;
  162. case RELESE:
  163. topPadding(topPadding);
  164. if (space < headerHeight + 30) {
  165. state = PULL;
  166. reflashViewByState();
  167. } else if (space <= 0) {
  168. state = NONE;
  169. isRefresh = false;
  170. reflashViewByState();
  171. }
  172. break;
  173. }
  174. }
  175. /**
  176. * 根据当前状态,改变界面显示;
  177. */
  178. private void reflashViewByState() {
  179. TextView tip = (TextView) topView.findViewById(R.id.tip);
  180. ImageView arrow = (ImageView) topView.findViewById(R.id.arrow);
  181. ProgressBar progress = (ProgressBar) topView.findViewById(R.id.progress_refresh);
  182. RotateAnimation anim = new RotateAnimation(0, 180,
  183. RotateAnimation.RELATIVE_TO_SELF, 0.5f,
  184. RotateAnimation.RELATIVE_TO_SELF, 0.5f);
  185. anim.setDuration(500);
  186. anim.setFillAfter(true);
  187. RotateAnimation anim1 = new RotateAnimation(180, 0,
  188. RotateAnimation.RELATIVE_TO_SELF, 0.5f,
  189. RotateAnimation.RELATIVE_TO_SELF, 0.5f);
  190. anim1.setDuration(500);
  191. anim1.setFillAfter(true);
  192. switch (state) {
  193. case NONE:
  194. arrow.clearAnimation();
  195. topPadding(-headerHeight);
  196. break;
  197. case PULL:
  198. arrow.setVisibility(View.VISIBLE);
  199. progress.setVisibility(View.GONE);
  200. tip.setText("下拉可以刷新!");
  201. arrow.clearAnimation();
  202. arrow.setAnimation(anim1);
  203. break;
  204. case RELESE:
  205. arrow.setVisibility(View.VISIBLE);
  206. progress.setVisibility(View.GONE);
  207. tip.setText("松开可以刷新!");
  208. arrow.clearAnimation();
  209. arrow.setAnimation(anim);
  210. break;
  211. case REFLASHING:
  212. topPadding(50);
  213. arrow.setVisibility(View.GONE);
  214. progress.setVisibility(View.VISIBLE);
  215. tip.setText("正在刷新...");
  216. arrow.clearAnimation();
  217. break;
  218. }
  219. }
  220. private OnRefreshListener onRefreshListener;
  221. public void setOnRefreshListener(OnRefreshListener onRefreshListener){
  222. this.onRefreshListener = onRefreshListener;
  223. }
  224. /**
  225. * 加载数据接口
  226. * @author Administrator
  227. *
  228. */
  229. public interface OnRefreshListener{
  230. void onRefresh();
  231. }
  232. /**
  233. * 数据加载完成
  234. */
  235. @SuppressLint("SimpleDateFormat")
  236. public void refreshComplete(){
  237. state = NONE;
  238. isRefresh = false;
  239. reflashViewByState();
  240. TextView lastupdatetime = (TextView) topView
  241. .findViewById(R.id.lastupdate_time);
  242. SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
  243. Date date = new Date(System.currentTimeMillis());
  244. String time = format.format(date);
  245. lastupdatetime.setText(time);
  246. }
  247. }
  248. </span>

顶部下拉刷新布局top.xml

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:orientation="vertical" >
  5. <RelativeLayout
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content"
  8. android:paddingBottom="10dip"
  9. android:paddingTop="10dip" >
  10. <LinearLayout
  11. android:id="@+id/layout"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_centerInParent="true"
  15. android:gravity="center"
  16. android:orientation="vertical" >
  17. <TextView
  18. android:id="@+id/tip"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:text="下拉可以刷新!" />
  22. <TextView
  23. android:id="@+id/lastupdate_time"
  24. android:layout_width="wrap_content"
  25. android:layout_height="wrap_content" />
  26. </LinearLayout>
  27. <ImageView
  28. android:id="@+id/arrow"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:layout_toLeftOf="@id/layout"
  32. android:layout_marginRight="20dip"
  33. android:src="@drawable/pull" />
  34. <ProgressBar
  35. android:id="@+id/progress_refresh"
  36. style="?android:attr/progressBarStyleSmall"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:layout_toLeftOf="@id/layout"
  40. android:layout_marginRight="20dip"
  41. android:visibility="gone" />
  42. </RelativeLayout>
  43. </LinearLayout></span>

三.其他文件代码

1.主布局activity_main.xml

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><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. <TextView
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="ListView底部分页刷新和顶部下拉刷新"
  11. android:gravity="center"
  12. android:textSize="18sp"
  13. android:textColor="#FF0000"
  14. android:layout_marginBottom="20dp"
  15. android:layout_marginTop="20dp"/>
  16. <ListView
  17. android:id="@+id/main_lv"
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent"
  20. ></ListView>
  21. </LinearLayout>
  22. </span>

2.底部分页布局activity_pagination.xml

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><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. <TextView
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="ListView底部分页刷新"
  11. android:gravity="center"
  12. android:textSize="18sp"
  13. android:textColor="#FF0000"
  14. android:layout_marginBottom="20dp"
  15. android:layout_marginTop="20dp"/>
  16. <com.example.paginationrefreshlistdemo.listview.PaginationListView
  17. android:id="@+id/pagination_lv"
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent"
  20. />
  21. </LinearLayout>
  22. </span>

3.顶部下拉刷新activity_refresh.xml

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><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. <TextView
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="ListView底部分页刷新"
  11. android:gravity="center"
  12. android:textSize="18sp"
  13. android:textColor="#FF0000"
  14. android:layout_marginBottom="20dp"
  15. android:layout_marginTop="20dp"/>
  16. <com.example.paginationrefreshlistdemo.listview.PaginationListView
  17. android:id="@+id/pagination_lv"
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent"
  20. />
  21. </LinearLayout>
  22. </span>

4.Adapter加载布局list_view.xml

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"><RelativeLayout 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. <LinearLayout
  6. android:id="@+id/content_ll"
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:layout_centerInParent="true"
  10. android:layout_marginLeft="20dp"
  11. android:gravity="center"
  12. android:orientation="vertical" >
  13. <TextView
  14. android:id="@+id/content_tv"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:text="亲亲,来一下"
  18. android:textColor="#FF0000" />
  19. <TextView
  20. android:id="@+id/date_tv"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:textColor="#00FF00" />
  24. </LinearLayout>
  25. <ImageView
  26. android:id="@+id/iv"
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content"
  29. android:layout_centerVertical="true"
  30. android:layout_toLeftOf="@id/content_ll"
  31. android:src="@drawable/emotion" />
  32. </RelativeLayout></span>

5.实体ApkBean

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.paginationrefreshlistdemo.bean;
  2. public class ApkBean {
  3. private String content;
  4. private String dateString;
  5. /**
  6. * @return the content
  7. */
  8. public String getContent() {
  9. return content;
  10. }
  11. /**
  12. * @param content the content to set
  13. */
  14. public void setContent(String content) {
  15. this.content = content;
  16. }
  17. /**
  18. * @return the dateString
  19. */
  20. public String getDateString() {
  21. return dateString;
  22. }
  23. /**
  24. * @param dateString the dateString to set
  25. */
  26. public void setDateString(String dateString) {
  27. this.dateString = dateString;
  28. }
  29. }
  30. </span>

6.适配器DemoAdapter

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.paginationrefreshlistdemo.adapter;
  2. import java.util.List;
  3. import com.example.paginationrefreshlistdemo.R;
  4. import com.example.paginationrefreshlistdemo.bean.ApkBean;
  5. import android.content.Context;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.ImageView;
  11. import android.widget.TextView;
  12. public class DemoAdapter extends BaseAdapter {
  13. private List<ApkBean> datas ;
  14. private LayoutInflater mInfalter;
  15. public DemoAdapter(Context context,List<ApkBean> datas){
  16. this.datas = datas;
  17. this.mInfalter = LayoutInflater.from(context);
  18. }
  19. public void updateView( List<ApkBean> datas ){
  20. this.datas = datas;
  21. this.notifyDataSetChanged();
  22. }
  23. @Override
  24. public int getCount() {
  25. // TODO Auto-generated method stub
  26. return datas.size();
  27. }
  28. @Override
  29. public Object getItem(int position) {
  30. // TODO Auto-generated method stub
  31. return datas.get(position);
  32. }
  33. @Override
  34. public long getItemId(int position) {
  35. // TODO Auto-generated method stub
  36. return position;
  37. }
  38. @Override
  39. public View getView(int position, View convertView, ViewGroup parent) {
  40. // TODO Auto-generated method stub
  41. HolderView holderView;
  42. if(convertView == null){
  43. holderView = new HolderView();
  44. convertView = mInfalter.inflate(R.layout.list_view_main, null);
  45. holderView.contentTv = (TextView) convertView.findViewById(R.id.content_tv);
  46. holderView.dateTv = (TextView) convertView.findViewById(R.id.date_tv);
  47. convertView.setTag(holderView);
  48. }else{
  49. holderView =(HolderView) convertView.getTag();
  50. }
  51. holderView.contentTv.setText(datas.get(position).getContent());
  52. if(datas.get(position).getDateString() == null){
  53. holderView.dateTv.setVisibility(View.GONE);
  54. }else{
  55. holderView.dateTv.setVisibility(View.VISIBLE);
  56. holderView.dateTv.setText(datas.get(position).getDateString());
  57. }
  58. return convertView;
  59. }
  60. public class HolderView{
  61. ImageView iv;
  62. TextView contentTv,dateTv;
  63. }
  64. }
  65. </span>

7.主函数MainActivity.java,一个ListView中包含底部下拉加载和顶部下拉刷新数据。

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.paginationrefreshlistdemo.activity;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.example.paginationrefreshlistdemo.R;
  5. import com.example.paginationrefreshlistdemo.adapter.DemoAdapter;
  6. import com.example.paginationrefreshlistdemo.bean.ApkBean;
  7. import android.app.Activity;
  8. import android.content.Intent;
  9. import android.os.Bundle;
  10. import android.view.View;
  11. import android.widget.AdapterView;
  12. import android.widget.AdapterView.OnItemClickListener;
  13. import android.widget.ListView;
  14. public class MainActivity extends Activity {
  15. private ListView mainLv;
  16. private DemoAdapter demoAdapter;
  17. private List<ApkBean> datas = new ArrayList<ApkBean>();
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. initData();
  23. mainLv =(ListView) this.findViewById(R.id.main_lv);
  24. mainLv.setOnItemClickListener(new OnItemClickListener() {
  25. @Override
  26. public void onItemClick(AdapterView<?> parent, View view,
  27. int position, long id) {
  28. switch (position) {
  29. case 0:
  30. startActvity(PaginationActivity.class);
  31. break;
  32. case 1:
  33. startActvity(RefreshActivity.class);
  34. break;
  35. }
  36. }
  37. });
  38. showView();
  39. }
  40. private void startActvity(Class<?> clz){
  41. Intent intent = new Intent();
  42. intent.setClass(this, clz);
  43. this.startActivity(intent);
  44. }
  45. private void initData(){
  46. ApkBean apkBean = new ApkBean();
  47. apkBean.setContent("ListView分页刷新");
  48. ApkBean apkBean2 = new ApkBean();
  49. apkBean2.setContent("ListView下拉刷新");
  50. datas.add(apkBean);
  51. datas.add(apkBean2);
  52. }
  53. private void showView(){
  54. if(demoAdapter == null){
  55. demoAdapter = new DemoAdapter(this, datas);
  56. mainLv.setAdapter(demoAdapter);
  57. }else{
  58. demoAdapter.updateView(datas);
  59. }
  60. }
  61. }
  62. </span>

8.分页加载PaginationActivity.java,使用PaginationListView

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.paginationrefreshlistdemo.activity;
  2. import java.text.SimpleDateFormat;
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.List;
  6. import com.example.paginationrefreshlistdemo.R;
  7. import com.example.paginationrefreshlistdemo.adapter.DemoAdapter;
  8. import com.example.paginationrefreshlistdemo.bean.ApkBean;
  9. import com.example.paginationrefreshlistdemo.listview.PaginationListView;
  10. import com.example.paginationrefreshlistdemo.listview.PaginationListView.OnLoadListener;
  11. import android.annotation.SuppressLint;
  12. import android.app.Activity;
  13. import android.os.Bundle;
  14. import android.os.Handler;
  15. import android.view.View;
  16. import android.widget.AdapterView;
  17. import android.widget.AdapterView.OnItemClickListener;
  18. public class PaginationActivity extends Activity implements OnLoadListener {
  19. private PaginationListView paginationLv;
  20. private DemoAdapter paginationAdapter;
  21. private List<ApkBean> datas = new ArrayList<ApkBean>();
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_pagination);
  26. initData();
  27. paginationLv = (PaginationListView) this
  28. .findViewById(R.id.pagination_lv);
  29. paginationLv.setOnLoadListener(this);
  30. paginationLv.setOnItemClickListener(new OnItemClickListener() {
  31. @Override
  32. public void onItemClick(AdapterView<?> parent, View view,
  33. int position, long id) {
  34. }
  35. });
  36. showView();
  37. }
  38. @SuppressLint("SimpleDateFormat")
  39. private void initData() {
  40. ApkBean apkBean;
  41. String dateString;
  42. long dateLong = new Date().getTime();
  43. for (int i = 0; i < 20; i++) {
  44. apkBean = new ApkBean();
  45. apkBean.setContent("这是一个美好的夜晚 " + i);
  46. dateLong = dateLong + i * 1000 * 6;
  47. dateString = new SimpleDateFormat("yyyy-MM-dd HHmmss")
  48. .format(new Date(dateLong));
  49. apkBean.setDateString(dateString);
  50. datas.add(apkBean);
  51. }
  52. }
  53. /**
  54. * 加载适配器
  55. */
  56. private void showView() {
  57. if (paginationAdapter == null) {
  58. paginationAdapter = new DemoAdapter(this, datas);
  59. paginationLv.setAdapter(paginationAdapter);
  60. } else {
  61. paginationAdapter.updateView(datas);
  62. }
  63. }
  64. @Override
  65. public void onLoad() {
  66. // 为了显示效果,采用延迟加载
  67. new Handler().postDelayed(new Runnable() {
  68. @Override
  69. public void run() {
  70. // TODO Auto-generated method stub
  71. initLoadData();
  72. showView();
  73. paginationLv.loadComplete();
  74. }
  75. }, 3000);
  76. }
  77. @SuppressLint("SimpleDateFormat")
  78. private void initLoadData() {
  79. ApkBean apkBean;
  80. String dateString;
  81. long dateLong = new Date().getTime();
  82. for (int i = 0; i < 20; i++) {
  83. apkBean = new ApkBean();
  84. apkBean.setContent("这是一个新的开始 " + i);
  85. dateLong = dateLong + i * 1000 * 6 * 60;
  86. dateString = new SimpleDateFormat("yyyy-MM-dd HHmmss")
  87. .format(new Date(dateLong));
  88. apkBean.setDateString(dateString);
  89. datas.add(apkBean);
  90. }
  91. }
  92. }
  93. </span>

9.顶部刷新RefreshActivity.java,使用自定义RefreshListView

  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.example.paginationrefreshlistdemo.activity;
  2. import java.text.SimpleDateFormat;
  3. import java.util.ArrayList;
  4. import java.util.Date;
  5. import java.util.List;
  6. import com.example.paginationrefreshlistdemo.R;
  7. import com.example.paginationrefreshlistdemo.adapter.DemoAdapter;
  8. import com.example.paginationrefreshlistdemo.bean.ApkBean;
  9. import com.example.paginationrefreshlistdemo.listview.RefreshListView;
  10. import com.example.paginationrefreshlistdemo.listview.RefreshListView.OnRefreshListener;
  11. import android.annotation.SuppressLint;
  12. import android.app.Activity;
  13. import android.os.Bundle;
  14. import android.os.Handler;
  15. import android.view.View;
  16. import android.widget.AdapterView;
  17. import android.widget.AdapterView.OnItemClickListener;
  18. public class RefreshActivity extends Activity implements OnRefreshListener{
  19. private RefreshListView refreshLv;
  20. private DemoAdapter refreshAdapter;
  21. private List<ApkBean> datas = new ArrayList<ApkBean>();
  22. @Override
  23. protected void onCreate(Bundle savedInstanceState) {
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.activity_refresh);
  26. initData();
  27. refreshLv =(RefreshListView) this.findViewById(R.id.refresh_lv);
  28. refreshLv.setOnRefreshListener(this);
  29. refreshLv.setOnItemClickListener(new OnItemClickListener() {
  30. @Override
  31. public void onItemClick(AdapterView<?> parent, View view,
  32. int position, long id) {
  33. }
  34. });
  35. showView();
  36. }
  37. @SuppressLint("SimpleDateFormat")
  38. private void initData(){
  39. ApkBean apkBean;
  40. String dateString;
  41. long dateLong = new Date().getTime();
  42. for (int i = 0; i < 20; i++) {
  43. apkBean = new ApkBean();
  44. apkBean.setContent("这是一个刷新的早晨 " + i);
  45. dateLong = dateLong + i * 1000 * 6;
  46. dateString = new SimpleDateFormat("yyyy-MM-dd HHmmss")
  47. .format(new Date(dateLong));
  48. apkBean.setDateString(dateString);
  49. datas.add(apkBean);
  50. }
  51. }
  52. private void showView(){
  53. if(refreshAdapter == null){
  54. refreshAdapter = new DemoAdapter(this, datas);
  55. refreshLv.setAdapter(refreshAdapter);
  56. }else{
  57. refreshAdapter.updateView(datas);
  58. }
  59. }
  60. @Override
  61. public void onRefresh() {
  62. new Handler().postDelayed(new Runnable() {
  63. @Override
  64. public void run() {
  65. initLoadData();
  66. refreshAdapter.updateView(datas);
  67. refreshLv.refreshComplete();
  68. }
  69. }, 3000);
  70. }
  71. @SuppressLint("SimpleDateFormat")
  72. private void initLoadData() {
  73. ApkBean apkBean;
  74. String dateString;
  75. long dateLong = new Date().getTime();
  76. for (int i = 0; i < 5; i++) {
  77. apkBean = new ApkBean();
  78. apkBean.setContent("刷新新的的数据 " + i);
  79. dateLong = dateLong + i * 1000 * 6 * 60;
  80. dateString = new SimpleDateFormat("yyyy-MM-dd HHmmss")
  81. .format(new Date(dateLong));
  82. apkBean.setDateString(dateString);
  83. datas.add(apkBean);
  84. }
  85. }
  86. }
  87. </span>

以上就是本文所有内容。

源码下载地址:http://download.csdn.net/detail/a123demi/8147253

发表评论

表情:
评论列表 (有 0 条评论,255人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Android ListView刷新

    ListView的重要性我就不多说了,下拉刷新的功能以前一直用的别人的,这两天参考一些资料自己写了个ListView下拉刷新的控件,自己会写才能掌握在自己手里,以后扩展什么的,