android ListView 数据分页加载
无情
阅读:573
2021-03-31 23:31:40
评论:0
Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验。因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据。
下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListView列表的底部添加一个“查看更多...”按钮来加载新闻(模拟新闻客户端)分页数据。同时限定每次加载10条记录,但完全加载完数据后,就把ListView列表底部视图“查看更多...”删除。假设加载的数据总数为 40 条记录。先看下该Demo工程的程序结构图:
相关布局文件
ListView布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listview_page"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0" />
</LinearLayout>
加载数据布局页面
<?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">
<Button
android:id="@+id/loadMoreButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="查看更多..." />
</LinearLayout>
ListView ----item布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 相关自定义控件 -->
<TextView
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
</TextView>
</LinearLayout>
ListView 分页源代码-----可以直接运用于项目之中。
package com.activity.gdbk;
import java.util.ArrayList;
import java.util.List;
import com.gdbk.dao.Bank;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
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.TextView;
import android.widget.Toast;
//Android ListViw 数据分页
public class PageActivity extends Activity implements OnScrollListener {
// 相关定义控件
private ListView listview_page;
// 数据加载控件
private View loadMoreView;
private Button loadMoreButton;
private Handler handler = new Handler();
// ListView 适配器
private PageAdapter adapter;
// ListView 相关分页参数设置
private int datasize = 40; // 模拟数据总条数
private int visibleLastIndex = 0;// 最后的可视项索引
private int visibleItemCount; // 当前窗口可见项总数
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
// 全屏展示
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_page);
loadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null);
loadMoreButton = (Button) loadMoreView
.findViewById(R.id.loadMoreButton);
loadMoreButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
loadMoreButton.setText("正在加载中..."); // 设置按钮文字
handler.postDelayed(new Runnable() {
@Override
public void run() {
loadMoreData();
adapter.notifyDataSetChanged();
loadMoreButton.setText("查看更多..."); // 恢复按钮文字
}
}, 2000);
}
});
listview_page = (ListView) findViewById(R.id.listview_page);
listview_page.addFooterView(loadMoreView); // 设置列表底部视图
initializeAdapter();
listview_page.setAdapter(adapter);
listview_page.setOnScrollListener(this);
}
// adapter初始化方法----initializeAdapter()
public void initializeAdapter() {
List<Bank> banks = new ArrayList<Bank>();
for (int i = 1; i <= 10; i++) {
Bank items = new Bank();
items.setBank_name("湖南省光大银行**支行");
banks.add(items);
}
adapter = new PageAdapter(banks);
}
// 分页加载相关数据信息
public void loadMoreData() {
int count = adapter.getCount();
if (count + 10 <= datasize) {
for (int i = count + 1; i <= count + 10; i++) {
Bank item = new Bank();
item.setBank_name("湖南省光大银行**支行");
adapter.addNewsItem(item);
}
} else {
for (int i = count + 1; i <= datasize; i++) {
Bank item = new Bank();
item.setBank_name("湖南省光大银行**支行");
adapter.addNewsItem(item);
}
}
}
// 自定义相关适配器
public class PageAdapter extends BaseAdapter {
// PageAdapter 相关参数
private List<Bank> data;
// PageAdapter 构造函数
public PageAdapter(List<Bank> data) {
super();
this.data = data;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// 加载相关布局文件
ViewHolder holder = null;
if (convertView == null) {
convertView = getLayoutInflater().inflate(
R.layout.listview_page_item, parent, false);
holder = new ViewHolder();
// 初始化相关控件
holder.content = (TextView) convertView
.findViewById(R.id.content);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
// 设置数据源信息
holder.content.setText(data.get(position).getBank_name());
return convertView;
}
// 自定义相关方法
/**
* 添加数据列表项
*
* @param bankitem
*/
public void addNewsItem(Bank bankitem) {
data.add(bankitem);
}
}
// 自定义ListView---布局文件类
public class ViewHolder {
private TextView content;
}
// 实现OnScrollListener接口---需要覆写的相关方法
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
this.visibleItemCount = visibleItemCount;
visibleLastIndex = firstVisibleItem + visibleItemCount - 1;
// 如果所有的记录选项等于数据集的条数,则移除列表底部视图
if (totalItemCount == datasize + 1) {
listview_page.removeFooterView(loadMoreView);
Toast.makeText(this, "数据全部加载完!", Toast.LENGTH_LONG).show();
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
int itemsLastIndex = adapter.getCount() - 1; // 数据集最后一项的索引
int lastIndex = itemsLastIndex + 1;
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE
&& visibleLastIndex == lastIndex) {
// 如果是自动加载,可以在这里放置异步加载数据的代码
}
}
}
效果展示:
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。