• 实现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>
    经验的积累在于平时的点滴、
  • 相关阅读:
    FFmpeg软件只是个解码编码软件,如果支持多种格式必须先安装好对应的库,下面就说下我装的库
    在Centos 6.5 X64下切割m3u8
    扩展自己的数组核心库
    关于小周同志在消息模块定位功能修改时存在的问题分析
    比对两个Word文件内容是否一致的C#解决办法
    如何实现artTemplate模板的可重用性,以此框架打造自己的自定义组件
    稍微谈一下 javascript 开发中的 MVC 模式
    Node.js 函数
    Node.js模块系统
    Node.js Stream(流)
  • 原文地址:https://www.cnblogs.com/yrhua/p/3409903.html
Copyright © 2020-2023  润新知