921
技術社區[雲棲]
Android listView滑動刷新代碼(分頁功能)
三個代碼都是從網上下載來的,但是導入到eclipse裏麵以後,中文注釋出現亂碼,所以我文章裏麵的注釋有很多可能是自己添加的,如有不準確的地方,敬請諒解和留言告知!
這個例子是listview一開始顯示10個,下拉listview,就會更新添加列表,知道第50個。
首先,布局文件是非常簡單,可以直接看代碼,首先,先看下自定義的一個簡單的Adapter:
- class listViewAdapter extends BaseAdapter {
- int count = 10;
- public int getCount() {
- return count;
- }
- public Object getItem(int pos) {
- return pos;
- }
- public long getItemId(int pos) {
- return pos;
- }
- public View getView(int pos, View v, ViewGroup p) {
- TextView view;
- if (v==null) {
- view = new TextView(MainActivity.this);
- }
- else {
- view=(TextView)v;
- }
- view.setText("ListItem " + pos);
- view.setTextSize(20f);
- view.setGravity(Gravity.CENTER);
- view.setHeight(60);
- return view;
- }
- }
在這裏初始化的count,就是listview的item個數是十個,當滑動的時候,再動態增加。
在看一下,在oncreate方法裏麵通過代碼把控件添加進去。
- //線性布局
- LinearLayout layout = new LinearLayout(this);
- //設置布局 水平方向
- layout.setOrientation(LinearLayout.HORIZONTAL);
- //進度條
- progressBar = new ProgressBar(this);
- //進度條顯示位置
- progressBar.setPadding(0, 0, 15, 0);
- //把進度條加入到layout中
- layout.addView(progressBar, mLayoutParams);
- //文本內容
- TextView textView = new TextView(this);
- textView.setText("加載中。。。");
- textView.setGravity(Gravity.CENTER_VERTICAL);
- //把文本加入到layout中
- layout.addView(textView, FFlayoutParams);
- //設置layout的重力方向,即對齊方式是
- layout.setGravity(Gravity.CENTER);
- ///設置ListView的頁腳layout
- loadingLayout = new LinearLayout(this);
- loadingLayout.addView(layout, mLayoutParams);
- loadingLayout.setGravity(Gravity.CENTER);
- //得到一個ListView用來顯示條目
- listView = getListView();
- //添加到頁腳顯示
- listView.addFooterView(loadingLayout);
- //給ListView添加適配器
- setListAdapter(adapter);
- //給ListView注冊滾動監聽
- listView.setOnScrollListener(this);
這裏麵用到了兩個layout屬性,它們的聲明是:
- /**
- * 設置布局顯示屬性
- */
- private LayoutParams mLayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
- /**
- * 設置布局顯示目標最大化屬性
- */
- private LayoutParams FFlayoutParams =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);
最重要的代碼如下:重寫了onScroll和onScrollStateChanged兩個方法:
- @Override
- public void onScroll(AbsListView v, int firstVisibleItem,int visibleItemCount, int totalItemCount) {
- Log.v("@@@@@@", "Scroll>>>first: " + firstVisibleItem + ", visible: " + visibleItemCount + ", total: " + totalItemCount);
- lastItem = firstVisibleItem + visibleItemCount - 1;
- Log.i("@@@@@@" , "Scroll>>>lastItem:" + lastItem);
- //顯示50條ListItem,即0-49,因為onScroll是在“滑動”執行過之後才觸發,所以用adapter.count<=41作條件
- if (adapter.count<=41) {
- if (firstVisibleItem+visibleItemCount==totalItemCount) {
- adapter.count += 10;
- adapter.notifyDataSetChanged();
- listView.setSelection(lastItem);
- Log.v("@@@@@@","onScroll "+adapter.count);
- int currentPage=adapter.count/10;
- Toast.makeText(getApplicationContext(), "第"+currentPage+"頁", Toast.LENGTH_LONG).show();
- }
- }else {
- listView.removeFooterView(loadingLayout);
- }
- }
- @Override
- public void onScrollStateChanged(AbsListView v, int state) {
- if (lastItem == adapter.count && state == OnScrollListener.SCROLL_STATE_IDLE) {
- Log.v("@@@@@@", "ScrollStateChanged>>>state:"+state+"lastItem:" + lastItem);
- if (adapter.count<=41) {
- adapter.count += 10;
- adapter.notifyDataSetChanged();
- Log.v("@@@@@@","onScrollStateChanged "+adapter.count);
- }
- }
- }
先說下onScroll方法的幾個參數的意義:
官方解釋如下:
|
|
---|---|
|
|
|
|
|
|
- firstVisibleItem:當前能看見的第一個列表項ID(從0開始)
- visibleItemCount:當前能看見的列表項總數(小半個也算,部分顯示的都算)
- totalItemCount:列表項共數
- lastItem = firstVisibleItem + visibleItemCount - 1;
- if (firstVisibleItem+visibleItemCount==totalItemCount) {
- adapter.count += 10;
- adapter.notifyDataSetChanged();
- listView.setSelection(lastItem);
- Log.v("@@@@@@","onScroll "+adapter.count);
- int currentPage=adapter.count/10;
- Toast.makeText(getApplicationContext(), "第"+currentPage+"頁", Toast.LENGTH_LONG).show();
- }
這樣的話,整個就比較容易理解了。
在listview裏麵還有幾個方法:
listView.getFirstVisiblePosition()是獲得現在屏幕第一個ListItem(第一個ListItem部分顯示也算)
listView.getLastVisiblePosition()現時屏幕最後一個ListItem(最後ListItem要完全顯示出來才算)
最後更新:2017-04-02 16:47:34