zoukankan      html  css  js  c++  java
  • 分页加载数据Demo

    分页加载数据Demo:当客户端从服务端获取数据量过大,一般为用户考虑流量,我们都需要对数据进行分页加载(譬如图片bitmap等)

     布局代码:listview

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:layout_width="match_parent"
     3     android:layout_height="match_parent"
     4     android:orientation="vertical" >
     5 
     6     <ListView
     7         android:id="@+id/listview"
     8         android:layout_width="fill_parent"
     9         android:layout_height="fill_parent" />
    10 
    11 </LinearLayout>

    item布局

     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="match_parent"
     5     android:orientation="vertical" >
     6     
     7     <TextView 
     8         android:id="@+id/tv_info"
     9         android:layout_width="match_parent"
    10         android:layout_height="wrap_content"
    11         android:textSize="20sp"
    12         android:textColor="@android:color/white"
    13         android:text="分页加载的数据    10"
    14         />
    15 
    16 </LinearLayout>

    footer页脚

     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     <ProgressBar 
     8         android:layout_width="wrap_content"
     9         android:layout_height="wrap_content"
    10         />
    11     
    12     <TextView 
    13         android:layout_width="match_parent"
    14         android:layout_height="wrap_content"
    15         android:textSize="20sp"
    16         android:textColor="@android:color/white"
    17         android:text="正在加载数据..........."
    18         android:layout_gravity="center_vertical"
    19         />
    20 
    21 </LinearLayout>

    模拟数据

     1 package com.android.hzy.service;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 public class DataService {
     7 
     8     public List<String> getData(int startPosition, int offset) {
     9         List<String> data = new ArrayList<String>();
    10         for (int i = 0; i < 20; i++) {
    11             data.add("分页加载的数据 " + i);
    12         }
    13         return data;
    14     }
    15 }

    MainActivity

      1 package com.android.hzy.pageloaddata;
      2 import java.util.ArrayList;
      3 import java.util.List;
      4 import android.app.Activity;
      5 import android.os.Bundle;
      6 import android.os.Handler;
      7 import android.os.Message;
      8 import android.os.SystemClock;
      9 import android.util.Log;
     10 import android.view.View;
     11 import android.widget.AbsListView;
     12 import android.widget.AbsListView.OnScrollListener;
     13 import android.widget.ArrayAdapter;
     14 import android.widget.ListView;
     15 
     16 import com.android.hzy.service.DataService;
     17 
     18 public class MainActivity extends Activity {
     19     
     20     private static final int SUCCESS_GET_DATA = 0;
     21 
     22     private ListView listview;
     23     private DataService service;
     24     private List<String> data; // 加载的总数据
     25     private ArrayAdapter<String> adapter;
     26     
     27     private boolean finish = true; // 是否加载完成
     28     private View footer;
     29     
     30     private Handler mHandler = new Handler(){
     31 
     32         @Override
     33         public void handleMessage(Message msg) {
     34             switch (msg.what) {
     35             case SUCCESS_GET_DATA:
     36                 ArrayList<String> result = (ArrayList<String>)msg.obj;
     37                 data.addAll(result);
     38                 adapter.notifyDataSetChanged(); // 让listview自动刷新
     39                 finish = true; // 加载完成
     40                 if(listview.getFooterViewsCount() > 0){ // 当页脚大于0 就删除页脚
     41                     listview.removeFooterView(footer);
     42                 }
     43                 break;
     44 
     45             default:
     46                 break;
     47             }
     48         }
     49         
     50     };
     51 
     52     @Override
     53     protected void onCreate(Bundle savedInstanceState) {
     54         super.onCreate(savedInstanceState);
     55         setContentView(R.layout.activity_main);
     56 
     57         listview = (ListView) findViewById(R.id.listview);
     58         service = new DataService();
     59         data = new ArrayList<String>();
     60 
     61         List<String> result = service.getData(0, 20);
     62         data.addAll(result);
     63         adapter = new ArrayAdapter<String>(getApplicationContext(),R.layout.item, R.id.tv_info, data);
     64         
     65         footer = View.inflate(getApplicationContext(), R.layout.footer, null);
     66         
     67         listview.addFooterView(footer); // 这里必须添加页脚让setAdapter里面满足  if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0)条件
     68         listview.setAdapter(adapter);
     69         listview.removeFooterView(footer);// 移除掉
     70         
     71         // 设置listview的滚动监听
     72         listview.setOnScrollListener(new MyOnScrollListener());
     73         
     74         
     75         
     76     }
     77     
     78     private final class MyOnScrollListener implements OnScrollListener{
     79 
     80         
     81         private int countPage = 5; // 加载的总页数
     82         private int pageSize = 20; // 每页加载20条数据
     83         
     84         @Override
     85         public void onScrollStateChanged(AbsListView view, int scrollState) {
     86             // TODO Auto-generated method stub
     87             Log.i("i", "  scrollState   " + scrollState);
     88         }
     89 
     90         @Override
     91         public void onScroll(AbsListView view, int firstVisibleItem,
     92                 int visibleItemCount, int totalItemCount) {
     93             // TODO Auto-generated method stub
     94             Log.i("i", " firstVisibleItem:" + firstVisibleItem + ",visibleItemCount:" + visibleItemCount
     95                     + ",totalItemCount:" + totalItemCount);
     96             
     97             final int totalCount = firstVisibleItem + visibleItemCount; // 已经加载了多少条目
     98             int currentPage = totalCount/pageSize; // 当前页
     99             int nextPage = currentPage + 1; // 下一页
    100             if (totalCount == totalItemCount && nextPage <= countPage && finish) {// 已经移动到了listview的最后一个条目去加载
    101 
    102                 finish = false; // 加载未完成
    103                 // 加载数据时 添加页脚
    104                 listview.addFooterView(footer);
    105                 
    106                 new Thread() {
    107                     public void run() {
    108                         SystemClock.sleep(3000);
    109                         List<String> result = service.getData(totalCount + 1, pageSize);//
    110                         // 发送消息给hander
    111                         Message msg = new Message();
    112                         msg.what = SUCCESS_GET_DATA;
    113                         msg.obj  = result;
    114                         mHandler.sendMessage(msg);
    115                     };
    116                 }.start();
    117             }
    118         }
    119         
    120     }
    121 
    122 }

  • 相关阅读:
    无缘无故出现IDEA无法引入包和类的问题?
    JDK8新特性——Optional
    【工具类】ExcelUtils
    【Mybatis-Plus学习笔记(二)】查询
    【Mybatis-Plus学习笔记(一)】入门
    【Mybatis学习笔记】目录
    【超详细全过程】DataGrip的安装与使用
    【超详细全过程】python环境配置+编辑器安装(python+pycharm)
    【Mybatis工具(五)】雪花算法
    【Mybatis工具(四)】UUID实现原理及其Java实现
  • 原文地址:https://www.cnblogs.com/androidez/p/2909665.html
Copyright © 2011-2022 走看看