导读:Android market里软件列表,每页显示10条记录,没有显示上一页,下一页的按钮,依靠手滑动动态加载数据,当向下滚动时,最下边显示 Loading… 。数据加载结束,Loading底栏消失。
Android market里软件列表,每页显示10条记录,没有显示上一页,下一页的按钮,依靠手滑动动态加载数据,当向下滚动时,最下边显示 Loading… 。数据加载结束,Loading底栏消失。关于ListView的分段显示,有现成的库可用,比如 cwac-endless, 这个库不好之处,就是底部Loading的View无法定制。还有一个在google code上的androidpageablelistview 这个可以实现基本的分页,有手动操作显示上一页,下一页的按钮。查阅了很多资料,发现其实ListView自带一个实现分页加载的方法,用到
addFooterView/removeView 这两个函数“添加”或“去掉“ListView页脚。下面是一个研究ListView分页时做的一个Demo,比较简单,我把思路我源码和大家分享一下,希望对大家有所帮助。
效果图:
实现思路如是:用onScroll方法实现”滑动“后处理检查是否还有新的记录,如果有,调用 addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了, 把自定义的mFooterView去掉。这里没有重写onScrollStateChanged函数,那么在onScroll就需要一个外部变量 mFirstCell记录滑动位置。
代码如下:
001 |
import android.app.ListActivity; |
002 |
import android.os.Bundle; |
003 |
import android.util.Log; |
004 |
import android.view.Gravity; |
005 |
import android.view.View; |
006 |
import android.view.ViewGroup; |
007 |
import android.widget.AbsListView; |
008 |
import android.widget.BaseAdapter; |
009 |
import android.widget.LinearLayout; |
010 |
import android.widget.ListView; |
011 |
import android.widget.ProgressBar; |
012 |
import android.widget.TextView; |
013 |
import android.widget.Toast; |
014 |
import android.widget.AbsListView.OnScrollListener; |
015 |
import android.widget.LinearLayout.LayoutParams; |
021 |
public class MainActivity extends ListActivity implements OnScrollListener
{ |
023 |
private static final String
TAG = "MainActivity" ; |
024 |
private listViewAdapter
adapter = new listViewAdapter(); |
026 |
private int lastItem
= 0 ; |
027 |
LinearLayout
loadingLayout; |
031 |
private LayoutParams
mLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); |
035 |
private LayoutParams
FFlayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT); |
037 |
private ProgressBar
progressBar; |
039 |
protected void onCreate(Bundle
savedInstanceState) { |
040 |
super .onCreate(savedInstanceState); |
041 |
Log.i(TAG, "onCreate(Bundle
savedInstanceState)>>>>>>>>>>>>>>>" ); |
043 |
LinearLayout
layout = new LinearLayout( this ); |
045 |
layout.setOrientation(LinearLayout.HORIZONTAL); |
047 |
progressBar
= new ProgressBar( this ); |
049 |
progressBar.setPadding( 0 , 0 , 15 , 0 ); |
051 |
layout.addView(progressBar,
mLayoutParams); |
053 |
TextView
textView = new TextView( this ); |
054 |
textView.setText( "加载中..." ); |
055 |
textView.setGravity(Gravity.CENTER_VERTICAL); |
057 |
layout.addView(textView,
FFlayoutParams); |
059 |
layout.setGravity(Gravity.CENTER); |
062 |
loadingLayout
= new LinearLayout( this ); |
063 |
loadingLayout.addView(layout,
mLayoutParams); |
064 |
loadingLayout.setGravity(Gravity.CENTER); |
067 |
listView
= getListView(); |
069 |
listView.addFooterView(loadingLayout); |
071 |
setListAdapter(adapter); |
073 |
listView.setOnScrollListener( this ); |
076 |
public void onScroll(AbsListView
v, int firstVisibleItem, |
077 |
int visibleItemCount, int totalItemCount)
{ |
078 |
Log.i(TAG
, "Scroll>>>first:
" +
firstVisibleItem + ",
visible: " +
visibleItemCount + ",
total: " +
totalItemCount); |
079 |
lastItem
= firstVisibleItem + visibleItemCount - 1 ; |
080 |
Log.i(TAG
, "Scroll>>>lastItem:" +
lastItem); |
082 |
if (adapter.count<= 41 )
{ |
083 |
if (firstVisibleItem+visibleItemCount==totalItemCount)
{ |
085 |
adapter.notifyDataSetChanged(); |
086 |
listView.setSelection(lastItem); |
087 |
int currentPage=adapter.count/ 10 ; |
088 |
Toast.makeText(getApplicationContext(), "第" +currentPage+ "页" ,
Toast.LENGTH_LONG).show(); |
092 |
listView.removeFooterView(loadingLayout); |
098 |
public void onScrollStateChanged(AbsListView
v, int state)
{ |
099 |
if (lastItem
== adapter.count && state == OnScrollListener.SCROLL_STATE_IDLE) { |
100 |
Log.i(TAG, "ScrollStateChanged>>>state:" +state+ "lastItem:" +
lastItem); |
102 |
if (adapter.count<= 41 )
{ |
104 |
adapter.notifyDataSetChanged(); |
114 |
class listViewAdapter extends BaseAdapter
{ |
116 |
public int getCount()
{ |
117 |
Log.i(TAG, "getCount>>>count:" +
count); |
120 |
public Object
getItem( int pos)
{ |
121 |
Log.i(TAG, "getItem>>>pos:" +
pos); |
124 |
public long getItemId( int pos)
{ |
125 |
Log.i(TAG, "getItemId>>>ItemId:" +
pos); |
128 |
public View
getView( int pos,
View v, ViewGroup p) { |
129 |
Log.i(TAG, "getView>>>pos:" +
pos); |
132 |
view
= new TextView(MainActivity. this ); |
137 |
view.setText( "ListItem
" +
pos); |
138 |
view.setTextSize(20f); |
139 |
view.setGravity(Gravity.CENTER); |