和大多数初级玩家一样,偶也终于玩到分页了~ ~分页有两个方法:一个是handler,一个是AsyncTask.

我的listview里没有包括图像,所以就没有用到AsyncTask.

准备工作:1.一个用来显示正在加载的xml文件:

View Code

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/loading_layout"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"android:gravity="center_horizontal"><RelativeLayoutandroid:id="@+id/load_id"android:orientation="horizontal" android:layout_width="fill_parent"android:layout_height="wrap_content"android:gravity="center"><TextView android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:gravity="center_vertical"android:text="Loading..."android:textSize="12pt" /><ProgressBar android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:layout_alignParentRight="true"/></RelativeLayout>
</LinearLayout>

2.listview布局文件:

View Code

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/customer_list"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ffffff"android:orientation="vertical" ><ListViewandroid:id="@+id/lv_newtask"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="5dip"android:layout_marginRight="5dip"android:cacheColorHint="#ffffff"android:divider="#ffffff"android:dividerHeight="5dip"android:listSelector="#00000000" ></ListView>
</LinearLayout>

3.listview_item

View Code

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="@drawable/newtask_selector_bg"android:minHeight="?android:attr/listPreferredItemHeight" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toLeftOf="@+id/avatar_image"android:orientation="vertical" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="订单号:"android:textColor="#2894ff"android:textSize="17sp" ></TextView><TextViewandroid:id="@+id/tv_newtask_item_cwb"android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="01056895426"android:textColor="#2894ff"android:textSize="17sp" ></TextView></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="客户名:"android:textColor="#2894ff"android:textSize="17sp" ></TextView><TextViewandroid:id="@+id/tv_newtask_item_consigneeName"android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="大胡子李"android:textColor="#2894ff"android:textSize="17sp" ></TextView></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="地    址:"android:textColor="#2894ff"android:textSize="17sp" ></TextView><TextViewandroid:id="@+id/tv_newtask_item_consigneeAddress"android:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingLeft="5dip"android:text="龙口西"android:textColor="#2894ff"android:textSize="17sp" ></TextView></LinearLayout><TextViewandroid:id="@+id/user_status"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone" /><TextViewandroid:id="@+id/user_id"android:layout_width="wrap_content"android:layout_height="wrap_content"android:visibility="gone" /></LinearLayout><ImageViewandroid:id="@+id/iv_newtask_detail"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:background="@drawable/detail" /></RelativeLayout>

下面就要开始写我们的分页类了。

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.newtask);context = this;findViews();initListView();}

View Code

TextView tv_newtask_num;ListView   lv_newtask;Context context;View loadingView;protected void findViews(){tv_newtask_num = (TextView) findViewById(R.id.tv_newtask_num);lv_newtask = (ListView) findViewById(R.id.lv_newtask);tv_newtask_num.setText(Constant.loginInfo.newTasksCount);loadingView = LayoutInflater.from(this).inflate(R.layout.list_page_load, null);}

初始化listView,第一页

NewTaskAdapter adapter;protected void initListView(){lv_newtask.addFooterView(loadingView);Constant.currentData = getData(currentPage, pageSize);adapter = new NewTaskAdapter();lv_newtask.setAdapter(adapter);lv_newtask.setOnScrollListener(this);lv_newtask.setOnItemClickListener(this);}

别急,NewTaskAdapter是它的内部类:

class NewTaskAdapter extends BaseAdapter {public NewTaskAdapter(){DebugLog.i("调用了adapter的构造函数");}LayoutInflater inflater = LayoutInflater.from(context);int count=Constant.currentData.size();@Overridepublic int getCount() {return count;}@Overridepublic TaskInfo getItem(int position) {return Constant.currentData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {ViewHolder mHolder = null;if (convertView == null) {mHolder = new ViewHolder();convertView = inflater.inflate(R.layout.item_newtask, null);mHolder.tv_cwb = (TextView) convertView.findViewById(R.id.tv_newtask_item_cwb);mHolder.tv_consigneeName = (TextView) convertView.findViewById(R.id.tv_newtask_item_consigneeName);mHolder.tv_consigneeAddress = (TextView) convertView.findViewById(R.id.tv_newtask_item_consigneeAddress);mHolder.iv_newtask_detail = (ImageView)convertView.findViewById(R.id.iv_newtask_detail);convertView.setTag(mHolder);}else{mHolder = (ViewHolder) convertView.getTag();}mHolder.tv_cwb.setText(Constant.currentData.get(position).cwb);mHolder.tv_consigneeName.setText(Constant.currentData.get(position).consigneeName);mHolder.tv_consigneeAddress.setText(Constant.currentData.get(position).consigneeAddress);mHolder.iv_newtask_detail.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Bundle bundle = new Bundle();bundle.putSerializable("taskDetail", Constant.currentData.get(position));Intent intent = new Intent(context,NewTaskDetailActivity.class);intent.putExtras(bundle);context.startActivity(intent);}});return convertView;}public  class ViewHolder{public TextView tv_cwb;public TextView tv_consigneeName;public TextView tv_consigneeAddress;public ImageView iv_newtask_detail; }}

Constant.currentData是什么呢?是我的全局类变量汇总: public  static ArrayList<TaskInfo> currentData = new ArrayList<TaskInfo>();

获取网络数据:

View Code

    private ProgressDialog progressDialog;//private ArrayList<TaskInfo> tempList = null;private String fail_reason;protected ArrayList<TaskInfo> getData(int currentPage, int pageSize){ArrayList<TaskInfo> tempList = null;final String url = String.format(Constant.URL_NEWTASKLIST, Constant.loginInfo.mSessionId,0,pageSize,(currentPage-1)*pageSize);DebugLog.i("url: **"+url);String result = HttpClient.INSTANCE.get(url);if(result!=null){TaskInfoListParser parser = new TaskInfoListParser();tempList = parser.parse(result);fail_reason = parser.reason;}return tempList;}

HttpClient.INSTANCE.get(url);这个方法:

View Code

public enum HttpClient {INSTANCE; final int Timeouts = 30 * 1000; // millisecondsDefaultHttpClient httpClient = null;HttpContext localContext = null;HttpResponse response = null;HttpPost httpPost = null;HttpGet httpGet = null;public void initHttpClient() {HttpParams myParams = new BasicHttpParams();HttpConnectionParams.setConnectionTimeout(myParams, Timeouts);HttpConnectionParams.setSoTimeout(myParams, Timeouts);httpClient = new DefaultHttpClient(myParams);localContext = new BasicHttpContext();}public String get(String url) {if (httpClient == null) {initHttpClient();}httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY,CookiePolicy.RFC_2109);httpGet = new HttpGet(url);response = null;httpGet.setHeader("Accept","application/soap+xml,application/dime,multipart/related,text/*");httpGet.setHeader("Content-Type", "text/xml;charset=utf-8");try {response = httpClient.execute(httpGet, localContext);if (response != null) {HttpEntity entity = response.getEntity();if (entity != null) {return EntityUtils.toString(entity, "utf-8");}} } catch (Exception ex) {ex.printStackTrace();}return "";}
}

接下来是重点:监听事件里面实现了分页;

View Code

private int last_item_position;boolean isLoading = false;//是否加载过,控制加载次数
    @Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {last_item_position = firstVisibleItem + visibleItemCount - 1;if (last_item_position == totalItemCount - 2){//表示在第九个位置加载if(!isLoading){new Thread(){public void run() {isLoading = true;updateCurrendData();};}.start();}}}

View Code

private int addnum = 0;//新增加的项目条数protected void updateCurrendData(){currentPage++;ArrayList<TaskInfo> list = getData(currentPage, pageSize);Message msg = new Message();if(list==null){msg.what = Constant.NODATA;}else{addnum = list.size();for(TaskInfo ti:list){Constant.currentData.add(ti);}msg.what = Constant.FINISH;}handler.sendMessage(msg);}

我的handler:

private  int currentPage = 1;private  int pageSize = 10;protected Handler handler = new Handler(){String tips = null;public void handleMessage(Message msg) {switch(msg.what){case Constant.FINISH:adapter.count = (currentPage-1)*pageSize+addnum; adapter.notifyDataSetChanged();handler.removeMessages(0);isLoading = false;break;case Constant.NODATA:Toast.makeText(context, "没有了", Toast.LENGTH_LONG).show();lv_newtask.removeFooterView(loadingView);break;}if(tips!=null){Toast.makeText(context, tips, Toast.LENGTH_LONG).show();}};    };

这样就实现了分页。一定要注意的是,

private  int currentPage = 1;
 private  int pageSize = 10;

这两个变量,一定不能设置成static 。这和activity的生命周期有关系。如果设置成了static ,那么onRestart以后,再请求的数据是空的,就会报出所谓的空指针异常了!

转载于:https://www.cnblogs.com/miya2012/archive/2012/08/28/2660685.html

ListView分页相关推荐

  1. android listview分页显示,Android应用中使用ListView来分页显示刷新的内容

    点击按钮刷新1.效果如下: 实例如下:  上图的添加数据按钮可以换成一个进度条  因为没有数据所以我加了一个按钮添加到数据库用于测试:一般在服务器拉去数据需要一定的时间,所以可以弄个进度条来提示用户: ...

  2. 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

    基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...

  3. Android ListView分页,动态添加数据

    1.ListView分页的实现,重点在于实现OnScrollListener接口,判断滑动到最后一项时,是否还有数据可以加载, 我们可以利用listView.addFootView(View v)方法 ...

  4. 分组显示的ListView分页加载数据

    参考:  http://www.cnblogs.com/qianxudetianxia/archive/2011/06/07/2074326.html 分组的ListView的拖拽  http://w ...

  5. WPF 实现 DataGrid/ListView 分页控件

    原文:WPF 实现 DataGrid/ListView 分页控件 在WPF中,通常会选用DataGrid/ListView进行数据展示,如果数据量不多,可以直接一个页面显示出来.如果数据量很大,200 ...

  6. ListView分页详解(非常有用)

    一.ListView分页: (一).目的:          Android 应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一 ...

  7. android json分页,移动测试之异步任务+JSON解析+ListView分页

    一.利用异步任务+JSON解析+ListView分页来实现网络访问数据显示在ListView中: (一).示例代码: public class MainActivity extends Activit ...

  8. android 之ListView分页效果以及从网络上加载数据一系列的综合运用

    数据分页策略: <1>:用多少查多少 <2>:全部查询出来,再进行分页处理 数据分页的有关算法: (1):起始索引值 = (当前页-1)*每页显示的记录数 (2):结束索引值 ...

  9. android listview 分页

    最近做了下listview的分页,跟WEB上的分页是一个意思,需要那几个分页参数,不同的是sqlite中分页的查询语句,简便的方法需要用Limit,Offset 关键字,前者是查询每页展示的记录数,后 ...

最新文章

  1. 操作无法完成后台打印程序无法运行
  2. vivo 全球商城:商品系统架构设计与实践
  3. HDU3657Game(最大流)
  4. 并发新特性—Executor 框架与线程池
  5. 使用Eclipsephp工具打开Thinkphp为什么会有红色的波浪线报警?
  6. 缺省的servlet(了解)
  7. xstream不映射字段_这本XStream学习手册,真的不来看看?
  8. struts2:JSP页面及Action中获取HTTP参数(parameter)的几种方式
  9. ajax中迭代是什么意思,Ajax 局部刷新迭代器的内容
  10. linux下c 链接mongodb,Linux下mongoDB下载与安装
  11. firebase登录验证_如何使用Firebase通过三步向身份验证本机添加身份验证
  12. 软件的艺术之美源于权衡(Trade-off)
  13. POJ_2828 Buy Ticket(线段树)
  14. 第03讲- 第一个Android项目
  15. Video Understanding(2)——Temporal Action Detection时序动作检测
  16. 最详细的 Deepin安装idea2018及破解教程,有效期到2100年
  17. 怎么看apache443端口是否打开_win7如何打开443端口
  18. 西门子1200 plc与台达14ES plc之间modbus 通讯实战程序 西门子1200plc做主站,台达DVP plc做从站,进行数据交换
  19. ImageExpert
  20. BIGEMAP离线数据包网盘下载地址:中国高清地图数据,中国高清谷歌数据 密码:1111

热门文章

  1. 配置FindBugs和常见FindBugs错误
  2. ArcGIS Engine中的8种数据访问【转】
  3. OpenCV-Python中的两种图像通道分离法
  4. 配置文件~/.ssh/config和/etc/ssh/ssh_config
  5. 如何运行Perl和查看帮助
  6. RedHat7/CentOS7 压缩解压命令汇总
  7. mysql 存储过程声明式游标_Mysql 存储过程中使用游标循环读取临时表
  8. OVS DPDK--介绍(一)
  9. angular集成websocket_Angular + Websocket
  10. 债务偿还方法 分期偿还法