ListView分页的Demo
2016-03-21 14:42
232 查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 | package com.administrator.listviewpager; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; /** * 分页: * 监听滑动事件 * 通过onScroll方法获得是否到底部 * 通过onScrollStateChanged方法监听停止滑动,且滑动到达底部,且异步任务未执行时启动异步任务获取分页数据 */ public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener{ private ListView lv; private TextView tv; private ArrayAdapter aa; private List<String> list; //当前页数 private int pager = 1 ; //每页条目数 private int num = 20 ; //初始visibleItemCount private int mVisibleItemCount = Integer.MAX_VALUE; //是否到底 private boolean isBottom; //是否正在执行异步任务 private boolean isStartTask; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) this .findViewById(R.id.lv); tv = (TextView) this .findViewById(R.id.tv); list = new ArrayList<>(); aa = new ArrayAdapter( this ,android.R.layout.simple_list_item_1,list); lv.setAdapter(aa); initData(); lv.setOnScrollListener( this ); } /** * 构造数据 */ private void initData() { for ( int i=(pager- 1 )*num;i<pager*num;i++){ list.add( "新闻" +(i+ 1 )); } aa.notifyDataSetChanged(); } /** * 加载分页数据 */ private void nextPager(){ pager++; initData(); } /** * * @param view * @param scrollState 滑动状态:1代表开始滑动,2代表手指离开后的惯性滑动,0代表停止滑动 */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // Log.i("sss", "scrollState" + scrollState); switch (scrollState){ case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: //状态为0停止滑动 //判断滑到底部并且异步任务没有执行的时候 if (isBottom && !isStartTask){ //设置异步任务开始执行 isStartTask = true ; new Task().execute(); } break ; case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: //状态为1开始滑动 break ; case AbsListView.OnScrollListener.SCROLL_STATE_FLING: //状态为2惯性滑动 break ; } } /** * 当firstVisibleItem与visibleItemCount的和为totalItemCount时为滑到底部 * @param view * @param firstVisibleItem 可见的第一条数据下标 * @param visibleItemCount 屏幕可见的数据总数 * @param totalItemCount 该ListView数据总数 */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //判断可见第一条下标为当前页第一条数据的时候 if (firstVisibleItem == (pager- 1 )*num && visibleItemCount!= 0 ){ //判断mVisibleItemCount取最小值 if (visibleItemCount<mVisibleItemCount){ mVisibleItemCount = visibleItemCount; } } // Log.i("aaa",mVisibleItemCount+" firstVisibleItem:"+firstVisibleItem); // Log.i("aaa", "firstVisibleItem:" + firstVisibleItem // +" visibleItemCount:"+ visibleItemCount // +" totalItemCount:" + totalItemCount); if (firstVisibleItem + mVisibleItemCount == totalItemCount){ //设置已到底部 isBottom = true ; } } /** * 异步耗时任务 */ class Task extends AsyncTask<Void,Integer,Void>{ @Override protected void onPreExecute() { super .onPreExecute(); tv.setVisibility(View.VISIBLE); } @Override protected Void doInBackground(Void... params) { for ( int i= 0 ;i< 10 ;i++){ try { Thread.sleep( 500 ); publishProgress(i); } catch (InterruptedException e) { e.printStackTrace(); } } return null ; } @Override protected void onProgressUpdate(Integer... values) { super .onProgressUpdate(values); switch (values[ 0 ]% 3 ){ case 0 : tv.setText( "数据加载中..." ); break ; case 1 : tv.setText( "数据加载中." ); break ; case 2 : tv.setText( "数据加载中.." ); break ; } } @Override protected void onPostExecute(Void aVoid) { super .onPostExecute(aVoid); //加载分页数据 nextPager(); // Log.i("aaa", pager + ""); tv.setVisibility(View.GONE); //设置不为底部 isBottom = false ; //设置异步任务执行结束 isStartTask = false ; } } } |
相关文章推荐
- 完美实现Android ListView中的TextView的跑马灯效果
- android上改变listView的选中颜色
- more、less 和 most 的区别
- Delphi7中Listview的常用功能汇总
- Delphi控件ListView的属性及使用方法详解
- 十万条Access数据表分页的两个解决方法
- sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
- 高效的mysql分页方法及原理
- asp又一个分页的代码例子
- SqlServer 2000、2005分页存储过程整理第1/3页
- ADO存取数据库时如何分页显示
- 透彻掌握ASP分页技术很详细的分析
- android中ListView数据刷新时的同步方法
- Android提高之ListView实现自适应表格的方法
- Android中实现水平滑动(横向滑动)ListView示例
- 一条SQL语句搞定Sql2000 分页
- 分页 SQLServer存储过程
- 实现SQL分页的存储过程代码
- sql分页查询几种写法
- SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)