ListView的分批加载简单操作

本文介绍如何使用Android的AsyncTask实现异步加载数据,并通过ListView展示数据集。文章详细展示了如何进行分页加载,包括初始数据加载、滚动监听事件的添加以及数据库查询方法的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 private ListView mLv_call_safe;
    private ProgressBar mPb_loading;
    private List<BlackNumInfo> mList;
    private MyAdapter mAdapter;
    //这是一次加载的数据的总数,随自己控制
    private final int MAX_NUM = 20;
    //这是从哪个位置开始加载
    private int startIndex = 0;
    //这里将加载数据库比喻成加载网路请求....主要是思路 :)
    private BlackNumDao mBlackNumDao;
 private void setData(){
        new MyAsyncTask() {
            @Override
            public void onPreExecute() {
//加载前显示进度条                mPb_loading.setVisibility(View.VISIBLE);
            }
//子线程加载数据            
            @Override
            public void doInBackground() {
mBlackNumDao = new BlackNumDao(getApplicationContext());
if (mList == null){
//第一次加载
mList = mBlackNumDao.querypartNum(MAX_NUM , startIndex);
else {
//将新加载的数据整合到之前的数据下面  
                  mList.addAll(mBlackNumDao.querypartNum(MAX_NUM , startIndex));
                }

            }
            @Override
            public void onPostExecute() {
     //如果是第一次加载,new对象,setAdapter       
      if (mAdapter == null){
         mAdapter = new MyAdapter();
         mLv_call_safe.setAdapter(mAdapter);
       }else {
     //如果不是第一次加载,只需要通知mAdapter 就行了
         mAdapter.notifyDataSetChanged();
       }//这里加载完需要隐藏对话框的
         mPb_loading.setVisibility(View.GONE);
      }
   }.execute();
}
  • 这里要个ListView添加滑动监听的事件
//              SCROLL_STATE_IDLE 空闲的状态 
//              SCROLL_STATE_FLING 快速滑动
//              SCROLL_STATE_TOUCH_SCROLL 缓慢滑动
mListView.setOnScrollListener(newAbsListView.OnScrollListener() {
            @Override//滑动状态改变调用的方法
            public void onScrollStateChanged(AbsListView view, int scrollState) {
    if (SCROLL_STATE_IDLE  == scrollState){
//ListView在界面的最后的条目,返回的是条目的在mList集合位置
       int position = mLv_call_safe.getLastVisiblePosition();
       //判断是否是查询数据的最后一个 0-19 下一次20-39
       if (position == mList.size() - 1){
       //加载下一波数据,
       startIndex += MAX_NUM;
       setData();
                    }

                }
            }
            //滑动的时候调用
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            }
        });
  • 数据库的那个查询方法
 public List<BlackNumInfo> querypartNum(int maxNum , int startNum){
        List<BlackNumInfo> list = new ArrayList<>();
        SQLiteDatabase database = mHelper.getWritableDatabase();
        //倒序查询,limit:设置总数,offset:设置起始位置
        Cursor cursor = database.rawQuery("select blacknum , mode "
                + " from " + BlackNumHelper.TABLE_NAME + " order by _id desc limit ? offset ?"
                , new String[]{maxNum + "", startNum + ""});
        while (cursor.moveToNext()){
            String num = cursor.getString(cursor.getColumnIndex(BlackNumHelper.TABLE_NUM));
            int mode = cursor.getInt(cursor.getColumnIndex(BlackNumHelper.TABLE_MODE));
            BlackNumInfo info = new BlackNumInfo(num , mode);
            list.add(info);
        }
        cursor.close();
        database.close();
        return list ;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值