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 }

運行效果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM