• Android中ListView分页加载数据


    public class MainActivity extends Activity {
    
        private ListView listView=null;
        
        //listview的数据填充器
        private ArrayAdapter<String> adapter;
        //listview中数据的集合
        private List<String> data;
        //下一页初始化为0
        int nextpage = 0;
        //每一页记载多少数据
        private int number=10;
        //最多有几页
        private int maxpage=5;
        //用来判断是否加载完成
        private boolean loadfinish=true;
        private View v;
        private Handler handler;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //listview中脚跟的视图
            v=this.getLayoutInflater().inflate(R.layout.progress, null);
            listView=(ListView) super.findViewById(R.id.listview);
            //得到数据
            data=DataServer.getData(0,10);
            //实习化ArrayAdapter对象
            adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, data);
            //添加listview的脚跟视图,这个方法必须在listview.setAdapter()方法之前,否则无法显示视图
            listView.addFooterView(v);
            //添加数据
            listView.setAdapter(adapter);
            //当下一页的数据加载完成之后移除改视图
            listView.removeFooterView(v);
            //当用户滑动listview到最后一项是,动态的加载第二页的数据
            listView.setOnScrollListener(new OnScrollListener() 
            {
                public void onScrollStateChanged(AbsListView view, int scrollState) 
                {
                    // TODO Auto-generated method stub
                }
                
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, final int totalItemCount)
                {
                    
                    
                    //得到listview最后一项的id
                    int lastItemId=listView.getLastVisiblePosition();
                    //判断用户是否滑动到最后一项,因为索引值从零开始所以要加上1
                    if((lastItemId+1)==totalItemCount)
                    {
                        /**
                         * 计算当前页,因为每一页只加载十条数据,所以总共加载的数据除以每一页的数据的个数
                         * 如果余数为零则当前页为currentPage=totalItemCount/number;
                         * 如果不能整除则当前页为(int)(totalItemCount/number)+1;
                         * 下一页则是当前页加1
                         */
                        int currentPage=totalItemCount%number;
                        if(currentPage==0)
                        {
                            currentPage=totalItemCount/number;
                        }
                        else
                        {
                            currentPage=(int)(totalItemCount/number)+1;
                        }
                        System.out.println("当前页为:"+currentPage);
                        nextpage=currentPage+1; 
                        //当总共的数据大于0是才加载数据
                        if(totalItemCount>0)
                        {
                            //判断当前页是否超过最大页,以及上一页的数据是否加载完成
                            if(nextpage<=maxpage && loadfinish )
                            {
                                //添加页脚视图
                                listView.addFooterView(v);
                                
                                loadfinish=false;
                                new Thread(new Runnable()
                                {
                                    public void run() 
                                    {
                                        try {
                                             
                                            Thread.sleep(2000);
                                        } catch (InterruptedException e) {
                                            // TODO Auto-generated catch block
                                            e.printStackTrace();
                                        }
                                        //获取当前加载页的数据
                                        data=DataServer.getData(totalItemCount, 10);
                                        //通知listview改变UI中的数据
                                        handler.sendEmptyMessage(0);
                                    }
                                }).start();
                                //还可以通过这样的方式实现
                                //AsyncTaskLoadData asynctask=new AsyncTaskLoadData(totalItemCount);
                                ///asynctask.execute();
                            }
                        }
                        
                    }
                    //判断加载的数据的页数有没有超过最大页,并且是否已经记载完成
                    
                }
            });
            
            handler=new Handler()
            {
                @SuppressLint("HandlerLeak")
                public void handleMessage(Message msg)
                {
                    if(msg.what==0)
                    {
                        //通知listview中的数据已经改动
                        adapter.notifyDataSetChanged();
                        loadfinish=true;
                    }
                    super.handleMessage(msg);
                    //判断listview中的页脚视图是否存在,如果存在在删除页脚视图
                    if(listView.getFooterViewsCount()!=0)
                    {
                        listView.removeFooterView(v);
                    }
                }
            };
            
        }
        
        //异步加载数据
        @SuppressWarnings("unused")
        private final class AsyncTaskLoadData extends AsyncTask<Object, Object, Object>
        {
            private int count;
            private List<String> list;
            public AsyncTaskLoadData(int totalItemCount) {
                this.count=totalItemCount;
                list=new ArrayList<String>();
            }
    
            protected Object doInBackground(Object... params) {
                list=DataServer.getData(count, 10);
                return null;
            }
    
            @Override
            protected void onPostExecute(Object result) 
            {
                try {
                    data=list;
                    
                    adapter.notifyDataSetChanged();
                    Thread.sleep(2000);
                    loadfinish=true;
                    if(listView.getFooterViewsCount()!=0)
                    {
                        listView.removeFooterView(v);
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                super.onPostExecute(result);
            }
            
            
        }
        
        
    }

    数据提供类

     1 public class DataServer 
     2 {
     3     private static List<String> data=new ArrayList<String>();
     4     public static List<String> getData(int offset, int maxnumber)
     5     {
     6         for(int i=0;i<maxnumber;i++)
     7         {
     8             data.add("Listview分页加载数据"+"item"+i);
     9         }
    10         return data;
    11     }
    12 }

    运行效果:

  • 相关阅读:
    407 Trapping Rain Water II 接雨水 II
    406 Queue Reconstruction by Height 根据身高重建队列
    405 Convert a Number to Hexadecimal 数字转换为十六进制数
    404 Sum of Left Leaves 左叶子之和
    403 Frog Jump 青蛙过河
    402 Remove K Digits 移掉K位数字
    401 Binary Watch 二进制手表
    400 Nth Digit 第N个数字
    398 Random Pick Index 随机数索引
    397 Integer Replacement 整数替换
  • 原文地址:https://www.cnblogs.com/tianshidechibang234/p/3194121.html
Copyright © 2020-2023  润新知