对于ListView分页加载数据,是正常情况下是非常有必要。一般对于少量的数据一次性把全部数据加载到ListView中显示,对于数据量多比较大,特别在资源有限的手机设备中更有重要,由用户去点击加载想要数据更为合适。在一些博客上看到关于ListView分页加载,但不太全面,实用性不高,因此我模拟正常情况下ListView分页加载,对于有方面帮助的朋友肯定有用,由于本人技术有限,可能存在些问题,欢迎指正,谢谢!

原创文章,转载请注明出处!谢谢!http://www.cnblogs.com/zhangkai281/

1.  先看效果吧,

    

 

 
2. java代码:MainActivity.java

/**
* ListView分页加载数据
*
@author zhangkai281
*
*/
public class MainActivity extends Activity {
private ListView listView;
private List<Map<String,Object>> data;
private listViewAdapter adapter;
//分页加载的数据的数量
private int pageSize=10;
private final int pageType=1;
//查看更多
private TextView moreTextView;
//正在加载进度条
private LinearLayout loadProgressBar;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_page);

listView
=(ListView)findViewById(R.id.lv_id);

//第一个参数:1起始数 第二个参数:显示的数目
data=InitValue.initValue(1,15);

//在ListView中添加"加载更多"
addPageMore();
//添加"加载更多"一定要在设置Adapter之前
adapter=new listViewAdapter();
listView.setAdapter(adapter);
}

private class listViewAdapter extends BaseAdapter{
int count=data.size();
@Override
public int getCount() {
return count;
}

@Override
public Object getItem(int position) {
return position;
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view
=LayoutInflater.from(MainActivity.this).inflate(R.layout.list_page_item, null);
TextView title
=(TextView)view.findViewById(R.id.tv_id);
TextView text
=(TextView)view.findViewById(R.id.title_id);
title.setText(data.get(position).get(
"title").toString());
text.setText(data.get(position).get(
"text").toString());
return view;
}

}

/**
* 加载下一页的数据
*
@param pageStart
*
@param pageSize
*/
private void chageListView(int pageStart,int pageSize){
List
<Map<String,Object>> data=InitValue.initValue(pageStart,pageSize);
for (Map<String, Object> map : data) {
this.data.add(map);
}
data
=null;
}

/**
* 在ListView中添加"加载更多"
*/
private void addPageMore(){
View view
=LayoutInflater.from(this).inflate(R.layout.list_page_load, null);
moreTextView
=(TextView)view.findViewById(R.id.more_id);
loadProgressBar
=(LinearLayout)view.findViewById(R.id.load_id);
moreTextView.setOnClickListener(
new Button.OnClickListener() {
@Override
public void onClick(View v) {
//隐藏"加载更多"
moreTextView.setVisibility(View.GONE);
//显示进度条
loadProgressBar.setVisibility(View.VISIBLE);

new Thread(new Runnable() {
@Override
public void run() {
//休眠3秒,用于模拟网络操作时间
try {
Thread.sleep(
3000);
}
catch (InterruptedException e) {
e.printStackTrace();
}

//加载模拟数据:下一页数据, 在正常情况下,上面的休眠是不需要,直接使用下面这句代码加载相关数据
chageListView(data.size(),pageSize);

Message mes
=handler.obtainMessage(pageType);
handler.sendMessage(mes);
}
}).start();
}
});
listView.addFooterView(view);
}

private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case pageType:
//改变适配器的数目
adapter.count += pageSize;
//通知适配器,发现改变操作
adapter.notifyDataSetChanged();

//再次显示"加载更多"
moreTextView.setVisibility(View.VISIBLE);
//再次隐藏“进度条”
loadProgressBar.setVisibility(View.GONE);
break;

default:
break;
}

super.handleMessage(msg);
}
};
}

3.  模拟数据,通常是通过网络取得服务器的数据,显示出来,得向服务传递参数包括分页相关,当时启起行数,每页显示多行数据。也可以加载本地的SQLite库中的数据。加载网络的比较比吧,以下只是模拟数据:

public class InitValue {
public static int page=1;

/**
* 模拟数据分页加载,
*
@param pageStart 起始数
*
@param pageSize 每页显示数目
*
@return
*/
public static List<Map<String,Object>> initValue(int pageStart,int pageSize){
Map
<String,Object> map;
List
<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
for(int i=0;i<pageSize;i++){
map
=new HashMap<String,Object>();
map.put(
"text", "zhangkai281发表文章");
map.put(
"title", page+"_ListView分页显示");
++page;
list.add(map);
}
return list;
}
}

4. 布局文件:main.xml:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height
="wrap_content" android:scrollbars="vertical">
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height
="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height
="wrap_content" android:text="@string/app_name" />
<ViewFlipper android:id="@+id/vf_id" android:layout_width="fill_parent"
android:layout_height
="wrap_content" />
</LinearLayout>
</ScrollView>

5. 布局文件:list_page.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation
="vertical" android:layout_width="fill_parent"
android:layout_height
="fill_parent">
<ListView android:id="@+id/lv_id" android:layout_width="fill_parent"
android:layout_height
="wrap_content"/>
</LinearLayout>

6. 布局文件:list_page_load.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width
="fill_parent" android:layout_height="fill_parent"
android:orientation
="vertical" android:gravity="center_horizontal"
android:paddingTop
="13dp" android:paddingBottom="13dp">
<TextView android:id="@+id/more_id" android:layout_width="fill_parent"
android:layout_height
="wrap_content" android:text="查看更多..."
android:textSize
="25dp" android:gravity="center_horizontal"/>
<LinearLayout android:id="@+id/load_id" android:orientation="horizontal"
android:layout_width
="wrap_content" android:layout_height="wrap_content"
android:visibility
="gone">
<ProgressBar android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_gravity
="center_horizontal" />
<TextView android:layout_width="wrap_content" android:layout_height="fill_parent"
android:gravity
="center_vertical" android:layout_marginLeft="10dp"
android:text
="正在加载..." android:textSize="20dp"/>
</LinearLayout>
</LinearLayout>

7. 还有此小xml加有列出,比较简单,此处省略,

希望此文章对朋友有所帮助,谢谢!

posted on 2011-07-27 14:19  zhangkai281  阅读(27523)  评论(5编辑  收藏  举报