閱讀921 返回首頁    go 技術社區[雲棲]


Android listView滑動刷新代碼(分頁功能)

三個代碼都是從網上下載來的,但是導入到eclipse裏麵以後,中文注釋出現亂碼,所以我文章裏麵的注釋有很多可能是自己添加的,如有不準確的地方,敬請諒解和留言告知!

這個例子是listview一開始顯示10個,下拉listview,就會更新添加列表,知道第50個。

       首先,布局文件是非常簡單,可以直接看代碼,首先,先看下自定義的一個簡單的Adapter:

[java] view plaincopy
  1. class listViewAdapter extends BaseAdapter {  
  2.         int count = 10;  
  3.   
  4.         public int getCount() {  
  5.             return count;  
  6.         }  
  7.   
  8.         public Object getItem(int pos) {  
  9.             return pos;  
  10.         }  
  11.   
  12.         public long getItemId(int pos) {  
  13.             return pos;  
  14.         }  
  15.   
  16.         public View getView(int pos, View v, ViewGroup p) {  
  17.             TextView view;  
  18.             if (v==null) {  
  19.                 view = new TextView(MainActivity.this);  
  20.             }  
  21.             else {  
  22.                 view=(TextView)v;  
  23.             }  
  24.             view.setText("ListItem " + pos);  
  25.             view.setTextSize(20f);  
  26.             view.setGravity(Gravity.CENTER);  
  27.             view.setHeight(60);  
  28.             return view;  
  29.         }  
  30.     }  

在這裏初始化的count,就是listview的item個數是十個,當滑動的時候,再動態增加。

在看一下,在oncreate方法裏麵通過代碼把控件添加進去。

[java] view plaincopy
  1. //線性布局  
  2.         LinearLayout layout = new LinearLayout(this);  
  3.        //設置布局 水平方向  
  4.         layout.setOrientation(LinearLayout.HORIZONTAL);  
  5.          //進度條  
  6.         progressBar = new ProgressBar(this);  
  7.          //進度條顯示位置  
  8.         progressBar.setPadding(00150);  
  9.         //把進度條加入到layout中  
  10.         layout.addView(progressBar, mLayoutParams);  
  11.         //文本內容  
  12.         TextView textView = new TextView(this);  
  13.         textView.setText("加載中。。。");  
  14.         textView.setGravity(Gravity.CENTER_VERTICAL);  
  15.         //把文本加入到layout中  
  16.         layout.addView(textView, FFlayoutParams);  
  17.         //設置layout的重力方向,即對齊方式是  
  18.         layout.setGravity(Gravity.CENTER);  
  19.           
  20.         ///設置ListView的頁腳layout  
  21.         loadingLayout = new LinearLayout(this);  
  22.         loadingLayout.addView(layout, mLayoutParams);  
  23.         loadingLayout.setGravity(Gravity.CENTER);  
  24.           
  25.         //得到一個ListView用來顯示條目  
  26.         listView = getListView();  
  27.         //添加到頁腳顯示  
  28.         listView.addFooterView(loadingLayout);  
  29.         //給ListView添加適配器  
  30.         setListAdapter(adapter);  
  31.         //給ListView注冊滾動監聽  
  32.         listView.setOnScrollListener(this);  

這裏麵用到了兩個layout屬性,它們的聲明是:

[java] view plaincopy
  1. /** 
  2.      * 設置布局顯示屬性 
  3.      */  
  4.     private LayoutParams mLayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);  
  5.     /** 
  6.      * 設置布局顯示目標最大化屬性 
  7.      */  
  8.     private LayoutParams FFlayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);  
  9.       

       最重要的代碼如下:重寫了onScroll和onScrollStateChanged兩個方法:

[java] view plaincopy
  1. @Override  
  2.     public void onScroll(AbsListView v, int firstVisibleItem,int visibleItemCount, int totalItemCount) {  
  3.         Log.v("@@@@@@""Scroll>>>first: " + firstVisibleItem + ", visible: " + visibleItemCount + ", total: " + totalItemCount);  
  4.         lastItem = firstVisibleItem + visibleItemCount - 1;  
  5.         Log.i("@@@@@@" , "Scroll>>>lastItem:" + lastItem);  
  6.         //顯示50條ListItem,即0-49,因為onScroll是在“滑動”執行過之後才觸發,所以用adapter.count<=41作條件  
  7.         if (adapter.count<=41) {  
  8.             if (firstVisibleItem+visibleItemCount==totalItemCount) {  
  9.                 adapter.count += 10;  
  10.                 adapter.notifyDataSetChanged();  
  11.                 listView.setSelection(lastItem);  
  12.                 Log.v("@@@@@@","onScroll  "+adapter.count);  
  13.                 int currentPage=adapter.count/10;  
  14.                 Toast.makeText(getApplicationContext(), "第"+currentPage+"頁", Toast.LENGTH_LONG).show();  
  15.             }  
  16.         }else {  
  17.              listView.removeFooterView(loadingLayout);   
  18.         }         
  19.     }  
  20.     @Override  
  21.     public void onScrollStateChanged(AbsListView v, int state) {  
  22.         if (lastItem == adapter.count && state == OnScrollListener.SCROLL_STATE_IDLE) {  
  23.             Log.v("@@@@@@""ScrollStateChanged>>>state:"+state+"lastItem:" + lastItem);  
  24.             if (adapter.count<=41) {  
  25.                 adapter.count += 10;  
  26.                 adapter.notifyDataSetChanged();  
  27.                 Log.v("@@@@@@","onScrollStateChanged  "+adapter.count);  
  28.             }  
  29.         }  
  30.     }  

先說下onScroll方法的幾個參數的意義:

      官方解釋如下:

  • view
  • The view whose scroll state is being reported
  • firstVisibleItem
  • the index of the first visible cell (ignore if visibleItemCount == 0)
  • visibleItemCount
  • the number of visible cells
  • totalItemCount
  • the number of items in the list adaptor

  1. firstVisibleItem:當前能看見的第一個列表項ID(從0開始)    
  2. visibleItemCount:當前能看見的列表項總數(小半個也算,部分顯示的都算)   
  3. totalItemCount:列表項共數

[java] view plaincopy
  1. lastItem = firstVisibleItem + visibleItemCount - 1;  
獲取最下麵那個item的id(position)值.

[java] view plaincopy
  1. if (firstVisibleItem+visibleItemCount==totalItemCount) {  
  2.                 adapter.count += 10;  
  3.                 adapter.notifyDataSetChanged();  
  4.                 listView.setSelection(lastItem);  
  5.                 Log.v("@@@@@@","onScroll  "+adapter.count);  
  6.                 int currentPage=adapter.count/10;  
  7.                 Toast.makeText(getApplicationContext(), "第"+currentPage+"頁", Toast.LENGTH_LONG).show();  
  8.             }  
如果listitem個數不足50,繼續添加,並把listview的焦點放到最下麵的item上。

這樣的話,整個就比較容易理解了。


在listview裏麵還有幾個方法:

listView.getFirstVisiblePosition()是獲得現在屏幕第一個ListItem(第一個ListItem部分顯示也算)

listView.getLastVisiblePosition()現時屏幕最後一個ListItem(最後ListItem要完全顯示出來才算)


最後更新:2017-04-02 16:47:34

  上一篇:go 從Java中String的subString函數說起
  下一篇:go 為什麼逗號表達式返回最後一個表達式的結果?--從另一個角度看C++