zoukankan      html  css  js  c++  java
  • 实现ListView的滑动加载

    关于这个功能一直是我想实现的功能,但是到现在还没有实现它,因为我的数据是从网络上获取的一段JSON格式的字符串,异步用的是AsyncTask,其实用哪一种方式取值都可以,关键在于如何将这段json字符串和适配器结合起来实现分页加载。

    下面我只实现了本地数据的滑动加载,至于网络数据的滑动加载还没。。

    Activity的实现

    public class MainActivity extends Activity {
    
        
        private ListView showlistview;
        private List<String> list=new ArrayList<String>();
        private ArrayAdapter<String> adapter;
        private View footview;//底部视图
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            showlistview=(ListView)findViewById(R.id.showlistview);
            showlistview.setOnScrollListener(new myscollviewpage());
    
            footview=getLayoutInflater().inflate(R.layout.load, null);
            list.addAll(Dataservice.getlist(0, 20));//添加数据
            
            adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,android.R.id.text1, list);
            
            //添加底部视图必须在setAdapter之前
            showlistview.addFooterView(footview);
            showlistview.setAdapter(adapter);
            showlistview.removeFooterView(footview);//移除
            
        }
        
    
    
        int number=20;//每次获取的数据
        int maxpage=5;//总共有多少页
        boolean loadfinish=true;//判断是否要加载数据
        
        class myscollviewpage implements OnScrollListener{
           // firstVisibleItem表示第一个的索引id
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
                int lastitemid=showlistview.getLastVisiblePosition();//获取当前页的最后一个索引id
                final int loadtotal=totalItemCount;
                if((lastitemid+1)==totalItemCount){//达到最好一条记录    
                    if(totalItemCount>0){
                        //當前頁
                        int currentpage=totalItemCount%number == 0 ? totalItemCount/number :totalItemCount/number+1;
                        int nextpage=currentpage+1;//下一页
                        if(nextpage<=maxpage&&loadfinish){
                            loadfinish=false;
                            showlistview.addFooterView(footview);//添加頁脚
                            new Thread(new Runnable() {            
                                @Override
                                public void run() {
                                    try {
                                        Thread.sleep(3000);//休眠3秒中
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                    List<String> result=Dataservice.getlist(loadtotal, number);//再次获取数据
                                    handler.sendMessage(handler.obtainMessage(100,result));//提示更新数据
                                }
                            }).start();
                        }
                    }
                }
            }
    
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                System.out.println("当前状态"+scrollState);
            }
        }
        
        Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                list.addAll((List<String>)msg.obj);//将获取到的数据添加到list中去
                adapter.notifyDataSetChanged();//刷新list
                if(showlistview.getFooterViewsCount()>0){//判断是否存在底部视图,存在则移除
                    showlistview.removeFooterView(footview);
                }
                loadfinish=true;
            }
        };
    }

    模拟数据的类

    public class Dataservice {
    
        public static List<String> getlist(int start,int stop){
            
            List<String> list=new ArrayList<String>();    
            for (int i = 0; i < 20; i++) {
                list.add("就快要成功了哦"+i);
            }
            
            return list;
        }
    }

    页脚(load.xml)

    <?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">  
            <ProgressBar 
                android:id="@+id/pp"
                android:layout_width="wrap_content"  
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="true"
                android:layout_height="wrap_content"  
                android:gravity="center"  
    android:layout_gravity="center_vertical|center_horizontal" /> </LinearLayout>
    经验的积累在于平时的点滴、
  • 相关阅读:
    ALINK(三):PYALINK 以及ALINK 任务运行(本地模式与集群模式)
    ALINK(二):使用 Maven 快速构建 Alink 项目(JAVA开发环境)
    ALINK(一):PYALINK安装(win10)
    leetcode算法题基础(四十八) 分治法总结(三)
    leetcode算法题基础(四十七) 分治法总结(二)
    leetcode算法题基础(四十六) 分治法总结(一)
    数据挖掘实践(54):xgboost 推导与实例
    office2016word 每次打开都有进度条问题 解决方式
    odoo 之报date<form string=''product lc''> 错误
    乌班图 输入法无效问题 即退出输入法
  • 原文地址:https://www.cnblogs.com/yrhua/p/3409903.html
Copyright © 2011-2022 走看看