ListView分页加载数据

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");

			}
		});
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值