安卓中listview分批加载数据

在使用listview显示成千上万条数据时, 加载速度可能就会很慢,这样用户体验就不是很好,为解决这个问题,我们可以分批加载ListView的数据。
分批加载ListView的步骤大致如下:首先取出一部分数据显示到ListView上,然后对ListView进行滚动监听,当用户滑动到ListView底部时,又加载一批数据显示到ListView上,
这样分批加载,用户总能看到新的数据。
笔者的简略代码如下:

1.0去数据库查询数据时先查前20条。

Cursor cursor = db.rawQuery(
" select number,mode from blacknumber order by _id desc limit ? offset ?;",new String[] { String.valueOf(maxnumber),String.valueOf(offset) });

2.0将查询出来的部分数据放到list集合中

new Thread() {
public void run() {
                if (list == null) {
                //list为空时,直接存数据
list = blackNumberDao.findPart(offset, maxnumber);
                } else {
//如果不为空,就将后面查询出来的数据加到集合尾部,否则list之前存放的数据将会丢失。    
            list.addAll(blackNumberDao.findPart(offset, maxnumber));
                }

3.0将list集合中的数据显示到ListView上。

runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
    //如果适配器为空,直接设置即可
                        if (myAdapter == null) {
                            myAdapter = new MyAdapter();
                            lv_call_safe.setAdapter(myAdapter);
                            //当适配器不为空时,让适配器更新即可,如果重新设置适配器,就会回到ListView首部。
                        } else {
                            myAdapter.notifyDataSetChanged();
                        }

                    }
                });

4.0对ListView进行滚动监听,当滑动到底部时重复以上步骤,继续分批加载剩下的数据。

// listveiw的滚动事件监听
        lv_call_safe.setOnScrollListener(new OnScrollListener() {
            // 滚动状态发生变化的时候调用
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                switch (scrollState) {
                case OnScrollListener.SCROLL_STATE_FLING:// 惯性滑行
                    break;

                case OnScrollListener.SCROLL_STATE_IDLE:// 空闲状态
                //得到ListView最后一个位置
                    int lastVisiblePosition = view.getLastVisiblePosition();
                    //滑动到最后一个位置,加载数据
                    if (lastVisiblePosition == (list.size() - 1)) {

                        fillData();
                    }
                    break;
                case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 手指触摸滑动
                    break;
                }
            }

            // 滚动的时候调用
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                if (firstVisibleItem == 0) {
                    View firstVisibleItemView = lv_call_safe.getChildAt(0);
                    if (firstVisibleItemView != null
                            && firstVisibleItemView.getTop() == 0) {
                        System.out.println("滚动到顶部 ");
                    }
                } else if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
                    View lastVisibleItemView = lv_call_safe
                            .getChildAt(lv_call_safe.getChildCount() - 1);
                    if (lastVisibleItemView != null
                            && lastVisibleItemView.getBottom() == lv_call_safe
                                    .getHeight()) {
                        System.out.println("滚动到底部 ");
                    }
                }
            }
        });

ListView分批加载数据的过程大致如上。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值