导读: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); |