listview展示数据,数据太多加载时间太长怎么办,下面为分页加载提供一种思路
一开始加载固定数据,等到用户滑动到没有数据了再去加载一部分数据,以此类推
代码注释已经够详细了,不再啰嗦
public class BlackNunberActivity extends Activity {
//显示数据的listview
private ListView list_view;
//listview的适配器
private BlackNumberAdapter adapter;
//保存数据的list
private List<BlackInfo> infos;
//数据保存在数据库中,用它来查询
private BlackNumberDao dao;
//线性布局,里面一个进度条
private LinearLayout ll_loading;
//输入要跳转到的页
private EditText et_number;
// 表示每页加载的最大的数据
private int mPageSize = 20;
// 表示当前页面
private int mCurrentNumber = 0;
//总页数
private int mTotalNumber;
//显示当前页/总页数
private TextView tv_current_total;
//数据查询开始位置
private int startIndex = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initUI();
initData();
}
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
// 当数据加载完毕之后。然后让loading界面隐藏起来
ll_loading.setVisibility(View.INVISIBLE);
if (adapter == null) {//第一次加载创建适配器
adapter = new BlackNumberAdapter(infos,
BlackNunberActivity.this);
list_view.setAdapter(adapter);
} else {//以后加载,直接通知适配器更新数据
adapter.notifyDataSetChanged();
}
};
};
private class Task implements Runnable {
public void run() {
if (infos == null) {//第一次查询一页数据
//从数据库中查找从startIndex开始的mPageSize条数据
infos = dao.findPart(startIndex, mPageSize);
} else {//以后查询完添加到infos中
infos.addAll(dao.findPart(startIndex, mPageSize));
}
//通知listview更新显示
handler.sendEmptyMessage(0);
}
}
/**
* 初始化数据
*/
private void initData() {
dao = new BlackNumberDao(BlackNunberActivity.this);
// 默认情况下。让loading的界面展示
ll_loading.setVisibility(View.VISIBLE);
// 获取到一共有多少页
mTotalNumber = dao.getTotalPage();
tv_current_total.setText(mCurrentNumber + "/" + mTotalNumber);
// 开启子线程加载数据
Task task = new Task();
//一个自定义线程池类
ThreadPoolManager manager = ThreadPoolManager.getInstance();
manager.addTask(task);
}
//listview适配器,MyBaseAdapter继承了BaseAdapter,封装了另外几个不常用的函数
private class BlackNumberAdapter extends MyBaseAdapter<BlackInfo> {
private ViewHolder holder;
public BlackNumberAdapter(List<BlackInfo> lists, Context context) {
super(lists, context);
}
public View getView(int position, View convertView, ViewGroup parent) {
View view = null;
//convertView 复用
if (convertView == null) {
view = View.inflate(BlackNunberActivity.this,
R.layout.item_call_safe, null);
//ViewHolder增加查找控件的速度,提高效率
holder = new ViewHolder();
holder.tv_number = (TextView) view.findViewById(R.id.tv_number);
holder.tv_mode = (TextView) view.findViewById(R.id.tv_mode);
holder.iv_delete = (ImageView) view
.findViewById(R.id.iv_delete);
view.setTag(holder);
} else {
view = convertView;
holder = (ViewHolder) view.getTag();
}
holder.tv_number.setText(infos.get(position).getNumber());
/**
* 1 电话 + 短信 拦截 (全部拦截) 2 短信拦截 3 电话拦截
*
* @param mode
*/
String mode = infos.get(position).getMode();
if (mode.equals("1")) {
holder.tv_mode.setText("电话 + 短信拦截");
} else if (mode.equals("2")) {
holder.tv_mode.setText("短信拦截");
} else if (mode.equals("3")) {
holder.tv_mode.setText("电话拦截");
}
final String number = infos.get(position).getNumber();
final BlackInfo blackInfo = infos.get(position);
return view;
}
}
/**
* 家庭组件
*
* @author Administrator
*
*/
static class ViewHolder {
TextView tv_number;
TextView tv_mode;
ImageView iv_delete;
}
/**
* 初始化界面
*/
private void initUI() {
setContentView(R.layout.activity_callsafe);
list_view = (ListView) findViewById(R.id.list_view);
ll_loading = (LinearLayout) findViewById(R.id.ll_loading);
// 实现listview的滚动监听
list_view.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
int position = list_view.getLastVisiblePosition();
// 当前的位置等于集合的总数。那么就需要分页
if (position == infos.size() - 1) {
System.out.println("position====:" + position);
startIndex = position + 1;
if (startIndex >= mTotalNumber) {
Toast.makeText(BlackNunberActivity.this, "已经没有更多的数据了",
0).show();
return;
}
initData();
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// System.out.println("onScroll");
}
});
}
}