Android中ListView数据处理优化
来源:互联网 发布:西南财经网络教育 编辑:程序博客网 时间:2024/05/29 11:06
来自:OPEN经验库
原帖:http://www.open-open.com/lib/view/open1330132229874.html
Android 应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过 分页的形式来展示数据,个人觉得这样会有更好的用户体验。因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。例如:微博客户端可能会在用户滑 动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据。
下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListView列表的底部添加一个“查看更多...”按钮来加载新闻(模拟 新闻客户端)分页数据。同时限定每次加载10条记录,但完全加载完数据后,就把ListView列表底部视图“查看更多...”删除。假设加载的数据总数 为 38 条记录。先看下该Demo工程的程序结构图:
其中包 com.andyidea.bean中News.java类是新闻实体类,包com.andyidea.listview中 paginationListViewActivity.java类是用来展示ListView列表。布局layout中包含三个布局文件,分别 为:list_item.xml , loadmore.xml , main.xml 。下面分别贴下源码:
layout中的 list_item.xml源码:
01
<
span
style
=
"font-size:13px;"
><?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02
<
LinearLayout
03
xmlns:android
=
"http://schemas.android.com/apk/res/android"
04
android:layout_width
=
"fill_parent"
05
android:layout_height
=
"fill_parent"
06
android:orientation
=
"vertical"
>
07
<
TextView
08
android:id
=
"@+id/newstitle"
09
android:layout_width
=
"fill_parent"
10
android:layout_height
=
"wrap_content"
/>
11
<
TextView
12
android:id
=
"@+id/newscontent"
13
android:layout_width
=
"fill_parent"
14
android:layout_height
=
"wrap_content"
/>
15
</
LinearLayout
></
span
>
01
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02
<
LinearLayout
03
xmlns:android
=
"http://schemas.android.com/apk/res/android"
04
android:layout_width
=
"fill_parent"
05
android:layout_height
=
"fill_parent"
>
06
<
Button
07
android:id
=
"@+id/loadMoreButton"
08
android:layout_width
=
"fill_parent"
09
android:layout_height
=
"wrap_content"
10
android:text
=
"查看更多..."
/>
11
</
LinearLayout
>
01
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
03
android:orientation
=
"vertical"
04
android:layout_width
=
"fill_parent"
05
android:layout_height
=
"fill_parent"
>
06
<
ListView
07
android:id
=
"@+id/lvNews"
08
android:layout_width
=
"fill_parent"
09
android:layout_height
=
"wrap_content"
/>
10
</LinearLayou
01
package
com.andyidea.bean;
02
03
/**
04
* 新闻实体类
05
* @author Andy.Chen
06
* @mail Chenjunjun.ZJ@gmail.com
07
*
08
*/
09
public
class
News {
10
11
private
String title;
//标题
12
private
String content;
//内容
13
14
public
String getTitle() {
15
return
title;
16
}
17
public
void
setTitle(String title) {
18
this
.title = title;
19
}
20
public
String getContent() {
21
return
content;
22
}
23
public
void
setContent(String content) {
24
this
.content = content;
25
}
26
27
}
001
package
com.andyidea.listview;
002
003
import
java.util.ArrayList;
004
import
java.util.List;
005
006
import
com.andyidea.bean.News;
007
008
import
android.app.Activity;
009
import
android.os.Bundle;
010
import
android.os.Handler;
011
import
android.util.Log;
012
import
android.view.View;
013
import
android.view.ViewGroup;
014
import
android.widget.AbsListView;
015
import
android.widget.AbsListView.OnScrollListener;
016
import
android.widget.BaseAdapter;
017
import
android.widget.Button;
018
import
android.widget.ListView;
019
import
android.widget.TextView;
020
import
android.widget.Toast;
021
022
public
class
PaginationListViewActivity
extends
Activity
implements
OnScrollListener {
023
024
private
ListView listView;
025
private
int
visibleLastIndex =
0
;
//最后的可视项索引
026
private
int
visibleItemCount;
// 当前窗口可见项总数
027
private
int
datasize =
38
;
//模拟数据集的条数
028
private
PaginationAdapter adapter;
029
private
View loadMoreView;
030
private
Button loadMoreButton;
031
private
Handler handler =
new
Handler();
032
033
/** Called when the activity is first created. */
034
@Override
035
public
void
onCreate(Bundle savedInstanceState) {
036
super
.onCreate(savedInstanceState);
037
setContentView(R.layout.main);
038
039
loadMoreView = getLayoutInflater().inflate(R.layout.loadmore,
null
);
040
loadMoreButton = (Button)loadMoreView.findViewById(R.id.loadMoreButton);
041
loadMoreButton.setOnClickListener(
new
View.OnClickListener() {
042
043
@Override
044
public
void
onClick(View v) {
045
loadMoreButton.setText(
"正在加载中..."
);
//设置按钮文字
046
handler.postDelayed(
new
Runnable() {
047
048
@Override
049
public
void
run() {
050
loadMoreData();
051
adapter.notifyDataSetChanged();
052
loadMoreButton.setText(
"查看更多..."
);
//恢复按钮文字
053
}
054
},
2000
);
055
056
}
057
});
058
059
listView = (ListView)findViewById(R.id.lvNews);
060
listView.addFooterView(loadMoreView);
//设置列表底部视图
061
initializeAdapter();
062
listView.setAdapter(adapter);
063
listView.setOnScrollListener(
this
);
064
}
065
066
@Override
067
public
void
onScrollStateChanged(AbsListView view,
int
scrollState) {
068
int
itemsLastIndex = adapter.getCount()-
1
;
//数据集最后一项的索引
069
int
lastIndex = itemsLastIndex +
1
;
070
if
(scrollState == OnScrollListener.SCROLL_STATE_IDLE
071
&& visibleLastIndex == lastIndex) {
072
// 如果是自动加载,可以在这里放置异步加载数据的代码
073
}
074
}
075
076
077
@Override
078
public
void
onScroll(AbsListView view,
int
firstVisibleItem,
079
int
visibleItemCount,
int
totalItemCount) {
080
this
.visibleItemCount = visibleItemCount;
081
visibleLastIndex = firstVisibleItem + visibleItemCount -
1
;
082
083
Log.e(
"========================= "
,
"========================"
);
084
Log.e(
"firstVisibleItem = "
,firstVisibleItem+
""
);
085
Log.e(
"visibleItemCount = "
,visibleItemCount+
""
);
086
Log.e(
"totalItemCount = "
,totalItemCount+
""
);
087
Log.e(
"========================= "
,
"========================"
);
088
089
//如果所有的记录选项等于数据集的条数,则移除列表底部视图
090
if
(totalItemCount == datasize+
1
){
091
listView.removeFooterView(loadMoreView);
092
Toast.makeText(
this
,
"数据全部加载完!"
, Toast.LENGTH_LONG).show();
093
}
094
}
095
096
/**
097
* 初始化ListView的适配器
098
*/
099
private
void
initializeAdapter(){
100
List<News> news =
new
ArrayList<News>();
101
for
(
int
i=
1
;i<=
10
;i++){
102
News items =
new
News();
103
items.setTitle(
"Title"
+i);
104
items.setContent(
"This is News Content"
+i);
105
news.add(items);
106
}
107
adapter =
new
PaginationAdapter(news);
108
}
109
110
/**
111
* 加载更多数据
112
*/
113
private
void
loadMoreData(){
114
int
count = adapter.getCount();
115
116
if
(count+
10
<= datasize){
117
for
(
int
i=count+
1
; i<=count+
10
; i++){
118
News item =
new
News();
119
item.setTitle(
"Title"
+i);
120
item.setContent(
"This is News Content"
+i);
121
adapter.addNewsItem(item);
122
}
123
}
else
{
124
for
(
int
i=count+
1
; i<=datasize; i++){
125
News item =
new
News();
126
item.setTitle(
"Title"
+i);
127
item.setContent(
"This is News Content"
+i);
128
adapter.addNewsItem(item);
129
}
130
}
131
132
}
133
134
135
class
PaginationAdapter
extends
BaseAdapter{
136
137
List<News> newsItems;
138
139
public
PaginationAdapter(List<News> newsitems){
140
this
.newsItems = newsitems;
141
}
142
143
@Override
144
public
int
getCount() {
145
return
newsItems.size();
146
}
147
148
@Override
149
public
Object getItem(
int
position) {
150
return
newsItems.get(position);
151
}
152
153
@Override
154
public
long
getItemId(
int
position) {
155
return
position;
156
}
157
158
@Override
159
public
View getView(
int
position, View view, ViewGroup parent) {
160
if
(view ==
null
){
161
view = getLayoutInflater().inflate(R.layout.list_item,
null
);
162
}
163
164
//新闻标题
165
TextView tvTitle = (TextView)view.findViewById(R.id.newstitle);
166
tvTitle.setText(newsItems.get(position).getTitle());
167
//新闻内容
168
TextView tvContent = (TextView)view.findViewById(R.id.newscontent);
169
tvContent.setText(newsItems.get(position).getContent());
170
171
return
view;
172
}
173
174
/**
175
* 添加数据列表项
176
* @param newsitem
177
*/
178
public
void
addNewsItem(News newsitem){
179
newsItems.add(newsitem);
180
}
181
182
}
183
184
}
最后,运行程序的结果截图如下:
通过上面的截图,当我们点击"查看更多..."按钮时,就会加载下10条记录,当加载完所有的记录后,ListView的底部视图将会移除。
来自:csdn mayingcai1987
原文:http://blog.csdn.net/mayingcai1987/article/details/6273606
1. 引言:
为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样可以极大的改善应用程序的性能和用户体验。
2. 交互:
进入ListView组件,首先预加载N条记录,当用户滑动到最后一条记录显示加载提示信息,并从后台加载N条数据,接着渲染UI界面。
3. 效果图:
4. 程序实现:
- package com.focus.loading;
- import android.app.ListActivity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.view.Gravity;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.AbsListView;
- import android.widget.BaseAdapter;
- import android.widget.LinearLayout;
- import android.widget.ListView;
- import android.widget.ProgressBar;
- import android.widget.TextView;
- import android.widget.AbsListView.OnScrollListener;
- import android.widget.LinearLayout.LayoutParams;
- public class ListViewLoadingActivity extends ListActivity implements
- OnScrollListener {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- /**
- * "加载项"布局,此布局被添加到ListView的Footer中。
- */
- mLoadLayout = new LinearLayout(this);
- mLoadLayout.setMinimumHeight(60);
- mLoadLayout.setGravity(Gravity.CENTER);
- mLoadLayout.setOrientation(LinearLayout.HORIZONTAL);
- /**
- * 向"加载项"布局中添加一个圆型进度条。
- */
- ProgressBar mProgressBar = new ProgressBar(this);
- mProgressBar.setPadding(0, 0, 15, 0);
- mLoadLayout.addView(mProgressBar, mProgressBarLayoutParams);
- /**
- * 向"加载项"布局中添加提示信息。
- */
- TextView mTipContent = new TextView(this);
- mTipContent.setText("加载中...");
- mLoadLayout.addView(mTipContent, mTipContentLayoutParams);
- /**
- * 获取ListView组件,并将"加载项"布局添加到ListView组件的Footer中。
- */
- mListView = getListView();
- mListView.addFooterView(mLoadLayout);
- /**
- * 组ListView组件设置Adapter,并设置滑动监听事件。
- */
- setListAdapter(mListViewAdapter);
- mListView.setOnScrollListener(this);
- }
- public void onScroll(AbsListView view, int mFirstVisibleItem,
- int mVisibleItemCount, int mTotalItemCount) {
- mLastItem = mFirstVisibleItem + mVisibleItemCount - 1;
- if (mListViewAdapter.count > mCount) {
- mListView.removeFooterView(mLoadLayout);
- }
- }
- public void onScrollStateChanged(AbsListView view, int mScrollState) {
- /**
- * 当ListView滑动到最后一条记录时这时,我们会看到已经被添加到ListView的"加载项"布局, 这时应该加载剩余数据。
- */
- if (mLastItem == mListViewAdapter.count
- && mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
- if (mListViewAdapter.count <= mCount) {
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- mListViewAdapter.count += 10;
- mListViewAdapter.notifyDataSetChanged();
- mListView.setSelection(mLastItem);
- }
- }, 1000);
- }
- }
- }
- class ListViewAdapter extends BaseAdapter {
- int count = 10;
- public int getCount() {
- return count;
- }
- public Object getItem(int position) {
- return position;
- }
- public long getItemId(int position) {
- return position;
- }
- public View getView(int position, View view, ViewGroup parent) {
- TextView mTextView;
- if (view == null) {
- mTextView = new TextView(ListViewLoadingActivity.this);
- } else {
- mTextView = (TextView) view;
- }
- mTextView.setText("Item " + position);
- mTextView.setTextSize(20f);
- mTextView.setGravity(Gravity.CENTER);
- mTextView.setHeight(60);
- return mTextView;
- }
- }
- private LinearLayout mLoadLayout;
- private ListView mListView;
- private ListViewAdapter mListViewAdapter = new ListViewAdapter();
- private int mLastItem = 0;
- private int mCount = 41;
- private final Handler mHandler = new Handler();
- private final LayoutParams mProgressBarLayoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- private final LayoutParams mTipContentLayoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- }
来自:51CTO论坛
原文:http://mobile.51cto.com/android-265878.htm
对于做Android应用程序来说,ListView一定用得非常多,经常解析xml文件然后在ListView中显示,往往我们需要让它动态地加载内容,也就是不一次性地加载完成,对于手机来说,这点很重要!笔者之前也是弄的不明白,用的时候直接在网上找代码,复制粘贴,再修改一下就是自己的了,笔者的这个小Demo灵感来自于新浪或者腾讯微博手机客户端,比如第一页加载十条Item,当翻到最后一个Item的时候,会出来一个Button,当点击Button的时候就会继续加载更多的,当然如果不点,就不会加载的,节约用户流量,先看效果图
如果觉得满意的话就继续看下面的代码吧,笔者这里没有用到main.xml文件,全部在java文件中定义的,如果理解了的话自己可以在xml文件里面写布局
- package com.focus.loading;
- import android.app.ListActivity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.view.Gravity;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup;
- import android.view.ViewGroup.LayoutParams;
- import android.widget.AbsListView;
- import android.widget.AbsListView.OnScrollListener;
- import android.widget.BaseAdapter;
- import android.widget.Button;
- import android.widget.LinearLayout;
- import android.widget.ListView;
- import android.widget.ProgressBar;
- import android.widget.TextView;
- public class ListViewActivity extends ListActivity implements OnScrollListener {
- private LinearLayout mLoadLayout;
- private LinearLayout mProgressLoadLayout;
- private ListView mListView;
- private ListViewAdapter mListViewAdapter = new ListViewAdapter();
- private int mLastItem = 0;
- private int mCount = 41;
- private final Handler mHandler = new Handler();// 在Handler中加载数据
- private final LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- int scrollState;// 全局变量,用来记录ScrollView的滚动状态,1表示开始滚动,2表示正在滚动,0表示滚动停止
- int visibleItemCount;// 当前可见页面中的Item总数
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- /**
- * "加载项"布局,此布局被添加到ListView的Footer中。
- */
- mLoadLayout = new LinearLayout(this);
- mLoadLayout.setMinimumHeight(30);
- mLoadLayout.setGravity(Gravity.CENTER);
- mLoadLayout.setOrientation(LinearLayout.VERTICAL);
- /*
- * 当点击按钮的时候显示这个View,此View使用水平方式布局,左边是一个进度条,右边是文本,默认设为不可见
- */
- mProgressLoadLayout = new LinearLayout(this);
- mProgressLoadLayout.setMinimumHeight(30);
- mProgressLoadLayout.setGravity(Gravity.CENTER);
- mProgressLoadLayout.setOrientation(LinearLayout.HORIZONTAL);
- ProgressBar mProgressBar = new ProgressBar(this);
- mProgressBar.setPadding(0, 0, 15, 0);
- mProgressLoadLayout.addView(mProgressBar, mLayoutParams);// 为布局添加进度条
- TextView mTipContent = new TextView(this);
- mTipContent.setText("加载中...");
- mProgressLoadLayout.addView(mTipContent, mLayoutParams);// 为布局添加文本
- mProgressLoadLayout.setVisibility(View.GONE);// 默认设为不可见,注意View.GONE和View.INVISIBLE的区别
- mLoadLayout.addView(mProgressLoadLayout);// 把之前的布局以View对象添加进来
- final Button button = new Button(this);
- button.setText("加载更多");
- // 添加按钮
- mLoadLayout.addView(button, new LayoutParams(LayoutParams.FILL_PARENT,
- LayoutParams.WRAP_CONTENT));
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mLastItem == mListViewAdapter.count
- && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
- // 当点击时把带进度条的Layout设为可见,把Button设为不可见
- mProgressLoadLayout.setVisibility(View.VISIBLE);
- button.setVisibility(View.GONE);
- if (mListViewAdapter.count <= mCount) {
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- mListViewAdapter.count += 10;
- mListViewAdapter.notifyDataSetChanged();
- mListView.setSelection(mLastItem
- - visibleItemCount + 1);
- // 获取数据成功时把Layout设为不可见,把Button设为可见
- mProgressLoadLayout.setVisibility(View.GONE);
- button.setVisibility(View.VISIBLE);
- }
- }, 2000);
- }
- }
- }
- });
- mListView = getListView();
- mListView.addFooterView(mLoadLayout);
- setListAdapter(mListViewAdapter);
- mListView.setOnScrollListener(this);
- }
- @Override
- public void onScroll(AbsListView view, int firstVisibleItem,
- int visibleItemCount, int totalItemCount) {
- this.visibleItemCount = visibleItemCount;
- mLastItem = firstVisibleItem + visibleItemCount - 1;
- if (mListViewAdapter.count > mCount) {
- mListView.removeFooterView(mLoadLayout);
- }
- }
- @Override
- public void onScrollStateChanged(AbsListView view, int scrollState) {
- this.scrollState = scrollState;
- }
- class ListViewAdapter extends BaseAdapter {
- int count = 10;
- public int getCount() {
- return count;
- }
- public Object getItem(int position) {
- return position;
- }
- public long getItemId(int position) {
- return position;
- }
- public View getView(int position, View view, ViewGroup parent) {
- TextView mTextView;
- if (view == null) {
- mTextView = new TextView(ListViewActivity.this);
- } else {
- mTextView = (TextView) view;
- }
- mTextView.setText("Item " + position);
- mTextView.setTextSize(20f);
- mTextView.setGravity(Gravity.CENTER);
- mTextView.setHeight(60);
- return mTextView;
- }
- }
- }
【编辑推荐】
Android ListView详解
使用ListView 显示数据
Android开发:自定义GridView/ListView数据源
Android开发:实现带图片和checkbox的listview
Android开发:实现带图片和checkbox的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的优化
- Android中ListView的优化问题
- Android中对ListView的优化处理
- android中listview的性能优化
- Android中ListView原理与优化 浅析
- android中listview优化的集中方法
- Android中优化ListView的ViewHolder模式
- unity3d开发需要知道的一些常量
- java环境变量设置
- oracle glogin.sql和login.sql
- 命令行进入mysql出错
- 利用 request session application
- Android中ListView数据处理优化
- hdu 1722 Cake
- AIX逻辑卷管理(LVM) 操作笔记
- Android OptionsMenu和 ContextMenu
- HttpServletRequest request=ServletActionContext.getRequest();
- Basics of Apache Ant
- onInterceptTouchEvent和onTouchEvent调用时序
- <action name="userAction_save" class="app.converter.UserAction" method="save">
- USACO Packing Rectangles