实现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>

 

 

posted @ 2013-11-06 10:12  小小缘  阅读(335)  评论(0编辑  收藏  举报