Android Listview动态加载数据
来源:互联网 发布:淘宝店释放是什么意思 编辑:程序博客网 时间:2024/05/16 05:13
在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中。我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好。我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间。网上看到了这样一个例子,挺好的,我改动了一下,达到了我想要的结果。
001
import
android.app.Activity;
002
import
android.os.Bundle;
003
import
android.os.Handler;
004
import
android.os.Message;
005
import
android.view.Gravity;
006
import
android.view.View;
007
import
android.view.ViewGroup;
008
import
android.widget.AbsListView;
009
import
android.widget.BaseAdapter;
010
import
android.widget.LinearLayout;
011
import
android.widget.ListView;
012
import
android.widget.ProgressBar;
013
import
android.widget.TextView;
014
import
android.widget.Toast;
015
import
android.widget.AbsListView.OnScrollListener;
016
import
android.widget.LinearLayout.LayoutParams;
017
018
public
class
ListViewForLoading
extends
Activity
implements
OnScrollListener {
019
020
private
listViewAdapter adapter =
new
listViewAdapter();
021
ListView listView;
022
LinearLayout loadingLayout;
023
private
Thread mThread;
024
/**
025
* 设置布局显示属性
026
*/
027
private
LayoutParams mLayoutParams =
new
LinearLayout.LayoutParams(
028
LinearLayout.LayoutParams.WRAP_CONTENT,
029
LinearLayout.LayoutParams.WRAP_CONTENT);
030
/**
031
* 设置布局显示目标最大化属性
032
*/
033
private
LayoutParams FFlayoutParams =
new
LinearLayout.LayoutParams(
034
LinearLayout.LayoutParams.FILL_PARENT,
035
LinearLayout.LayoutParams.FILL_PARENT);
036
037
private
ProgressBar progressBar;
038
039
/** Called when the activity is first created. */
040
@Override
041
public
void
onCreate(Bundle savedInstanceState) {
042
super
.onCreate(savedInstanceState);
043
setContentView(R.layout.main);
044
init();
045
}
046
047
private
void
init() {
048
// TODO Auto-generated method stub
049
// 线性布局
050
LinearLayout layout =
new
LinearLayout(
this
);
051
// 设置布局 水平方向
052
layout.setOrientation(LinearLayout.HORIZONTAL);
053
// 进度条
054
progressBar =
new
ProgressBar(
this
);
055
// 进度条显示位置
056
progressBar.setPadding(
0
,
0
,
15
,
0
);
057
// 把进度条加入到layout中
058
layout.addView(progressBar, mLayoutParams);
059
// 文本内容
060
TextView textView =
new
TextView(
this
);
061
textView.setText(
"加载中..."
);
062
textView.setGravity(Gravity.CENTER_VERTICAL);
063
// 把文本加入到layout中
064
layout.addView(textView, FFlayoutParams);
065
// 设置layout的重力方向,即对齐方式是
066
layout.setGravity(Gravity.CENTER);
067
068
// 设置ListView的页脚layout
069
loadingLayout =
new
LinearLayout(
this
);
070
loadingLayout.addView(layout, mLayoutParams);
071
loadingLayout.setGravity(Gravity.CENTER);
072
073
// 得到一个ListView用来显示条目
074
listView = (ListView) findViewById(R.id.tv);
075
// 添加到脚页显示
076
listView.addFooterView(loadingLayout);
077
// 给ListView添加适配器
078
listView.setAdapter(adapter);
079
// 给ListView注册滚动监听
080
listView.setOnScrollListener(
this
);
081
}
082
083
/**
084
* 要用用于生成显示数据
085
*
086
* @author huangbq
087
*
088
*/
089
class
listViewAdapter
extends
BaseAdapter {
090
int
count =
10
;
091
092
public
int
getCount() {
093
return
count;
094
}
095
096
public
Object getItem(
int
pos) {
097
return
pos;
098
}
099
100
public
long
getItemId(
int
pos) {
101
return
pos;
102
}
103
104
public
View getView(
int
pos, View v, ViewGroup p) {
105
TextView view;
106
if
(v ==
null
) {
107
view =
new
TextView(ListViewForLoading.
this
);
108
}
else
{
109
view = (TextView) v;
110
}
111
view.setText(
"ListItem "
+ pos);
112
view.setTextSize(20f);
113
view.setGravity(Gravity.CENTER);
114
view.setHeight(
60
);
115
return
view;
116
}
117
}
118
119
@Override
120
public
void
onScroll(AbsListView view,
int
firstVisibleItem,
121
int
visibleItemCount,
int
totalItemCount) {
122
// TODO Auto-generated method stub
123
if
(firstVisibleItem+visibleItemCount==totalItemCount)
124
{
125
//开线程去下载网络数据
126
if
(mThread ==
null
|| !mThread.isAlive()) {
127
mThread =
new
Thread() {
128
@Override
129
public
void
run() {
130
try
{
131
//这里放你网络数据请求的方法,我在这里用线程休眠5秒方法来处理
132
Thread.sleep(
5000
);
133
}
catch
(InterruptedException e) {
134
e.printStackTrace();
135
}
136
Message message =
new
Message();
137
message.what =
1
;
138
handler.sendMessage(message);
139
}
140
};
141
mThread.start();
142
}
143
}
144
}
145
146
@Override
147
public
void
onScrollStateChanged(AbsListView view,
int
scrollState) {
148
// TODO Auto-generated method stub
149
}
150
151
private
Handler handler =
new
Handler() {
152
@Override
153
public
void
handleMessage(Message msg) {
154
// TODO Auto-generated method stub
155
switch
(msg.what) {
156
case
1
:
157
if
(adapter.count <=
41
) {
158
adapter.count +=
10
;
159
int
currentPage = adapter.count /
10
;
160
Toast.makeText(getApplicationContext(),
"第"
+ currentPage +
"页"
, Toast.LENGTH_LONG).show();
161
}
else
{
162
listView.removeFooterView(loadingLayout);
163
}
164
//重新刷新Listview的adapter里面数据
165
adapter.notifyDataSetChanged();
166
break
;
167
default
:
168
break
;
169
}
170
}
171
172
};
173
}
运行结果如下图:
转自:http://www.cnblogs.com/tanlon/archive/2011/03/20/1989323.html
- android listView动态加载数据
- Android Listview动态加载数据
- Android Listview动态加载数据
- Android中ListView动态加载数据
- Android+Listview+分页+动态加载网络数据
- Android中使用Listview动态加载数据
- android listview 动态加载数据的问题
- Android ListView 的动态加载数据
- Android+Listview+分页+动态加载网络数据
- Android的ListView动态加载数据
- Android中ListView动态加载数据
- Android中ListView动态加载数据
- android ListView 动态分页加载数据
- ListView数据动态加载
- Listview动态加载数据
- Listview动态加载数据
- ListView动态加载数据
- Listview动态加载数据
- Android实现动态切换横竖屏,保存横竖屏数据(用Preference存储)
- 分词DLL导出小结
- C#中的引用传递、值传递
- python 字符串 大小写转换
- Linux设备驱动模型学习之基础中的基础篇
- Android Listview动态加载数据
- 学习iPhone开发中 sqlite3的使用
- 关于tableview 的一些属性设置
- Notification 详细运用
- Android pull封装,直接解析xml
- 由init、loadView、viewDidLoad、viewDidUnload、dealloc的关系说起
- Undelete PLUS完美使用指南
- Android添加音乐
- 数据库的自然连接, 投影,连接