ListView分页
来源:互联网 发布:产品推广软件 编辑:程序博客网 时间:2024/04/30 02:08
导读: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;
016
/**
017
*
018
* @author huangbq
019
*
020
*/
021
public
class
MainActivity
extends
ListActivity
implements
OnScrollListener {
022
023
private
static
final
String TAG =
"MainActivity"
;
024
private
listViewAdapter adapter =
new
listViewAdapter();
025
ListView listView ;
026
private
int
lastItem =
0
;
027
LinearLayout loadingLayout;
028
/**
029
* 设置布局显示属性
030
*/
031
private
LayoutParams mLayoutParams =
new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
032
/**
033
* 设置布局显示目标最大化属性
034
*/
035
private
LayoutParams FFlayoutParams =
new
LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);
036
037
private
ProgressBar progressBar;
038
@Override
039
protected
void
onCreate(Bundle savedInstanceState) {
040
super
.onCreate(savedInstanceState);
041
Log.i(TAG,
"onCreate(Bundle savedInstanceState)>>>>>>>>>>>>>>>"
);
042
//线性布局
043
LinearLayout layout =
new
LinearLayout(
this
);
044
//设置布局 水平方向
045
layout.setOrientation(LinearLayout.HORIZONTAL);
046
//进度条
047
progressBar =
new
ProgressBar(
this
);
048
//进度条显示位置
049
progressBar.setPadding(
0
,
0
,
15
,
0
);
050
//把进度条加入到layout中
051
layout.addView(progressBar, mLayoutParams);
052
//文本内容
053
TextView textView =
new
TextView(
this
);
054
textView.setText(
"加载中..."
);
055
textView.setGravity(Gravity.CENTER_VERTICAL);
056
//把文本加入到layout中
057
layout.addView(textView, FFlayoutParams);
058
//设置layout的重力方向,即对齐方式是
059
layout.setGravity(Gravity.CENTER);
060
061
//设置ListView的页脚layout
062
loadingLayout =
new
LinearLayout(
this
);
063
loadingLayout.addView(layout, mLayoutParams);
064
loadingLayout.setGravity(Gravity.CENTER);
065
066
//得到一个ListView用来显示条目
067
listView = getListView();
068
//添加到页脚显示
069
listView.addFooterView(loadingLayout);
070
//给ListView添加适配器
071
setListAdapter(adapter);
072
//给ListView注册滚动监听
073
listView.setOnScrollListener(
this
);
074
}
075
@Override
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);
081
//显示50条ListItem,即0-49,因为onScroll是在“滑动”执行过之后才触发,所以用adapter.count<=41作条件
082
if
(adapter.count<=
41
) {
083
if
(firstVisibleItem+visibleItemCount==totalItemCount) {
084
adapter.count +=
10
;
085
adapter.notifyDataSetChanged();
086
listView.setSelection(lastItem);
087
int
currentPage=adapter.count/
10
;
088
Toast.makeText(getApplicationContext(),
"第"
+currentPage+
"页"
, Toast.LENGTH_LONG).show();
089
}
090
}
091
else
{
092
listView.removeFooterView(loadingLayout);
093
}
094
095
096
}
097
@Override
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);
101
//显示50条ListItem,即0-49,因为onScrollStateChanged是在“拖动滑动”执行过之后才触发,所以用adapter.count<=41作条件
102
if
(adapter.count<=
41
) {
103
adapter.count +=
10
;
104
adapter.notifyDataSetChanged();
105
}
106
107
}
108
}
109
/**
110
* 要用用于生成显示数据
111
* @author huangbq
112
*
113
*/
114
class
listViewAdapter
extends
BaseAdapter {
115
int
count =
10
;
116
public
int
getCount() {
117
Log.i(TAG,
"getCount>>>count:"
+ count);
118
return
count;
119
}
120
public
Object getItem(
int
pos) {
121
Log.i(TAG,
"getItem>>>pos:"
+ pos);
122
return
pos;
123
}
124
public
long
getItemId(
int
pos) {
125
Log.i(TAG,
"getItemId>>>ItemId:"
+ pos);
126
return
pos;
127
}
128
public
View getView(
int
pos, View v, ViewGroup p) {
129
Log.i(TAG,
"getView>>>pos:"
+ pos);
130
TextView view;
131
if
(v==
null
) {
132
view =
new
TextView(MainActivity.
this
);
133
}
134
else
{
135
view=(TextView)v;
136
}
137
view.setText(
"ListItem "
+ pos);
138
view.setTextSize(20f);
139
view.setGravity(Gravity.CENTER);
140
view.setHeight(
60
);
141
return
view;
142
}
143
}
144
}
- Listview分页
- ListView分页
- listView分页
- ListView分页
- listview分页
- listview分页
- ListView分页
- ListView分页
- ListView分页
- ListView分页
- ListView分页
- listview分页
- ListView分页
- ListView优化技巧 ,ListView分页
- 例用AdoQuery+ListView分页
- ListView之分页技术
- android listview 分页
- ListView分页显示数据
- 多看看的启迪故事
- 在Labs开会
- Android运行:Error generating final archive
- 解决Ubuntu下使用adb的no permissions问题
- Android布局之LinearLayout(线性布局)
- ListView分页
- java 比较两个文件是否相同
- open c pkg
- 一个程序员的疑惑-希望资深人士指教下
- k__BackingField与反编译
- 连连看小游戏java源代码(1)
- 新浪微博底部布局
- 关于C语言的几点总结
- 客户端配置防火墙后使用ftp传送数据