Android初学之listView分批加载数据

来源:互联网 发布:网络游戏音乐视频 编辑:程序博客网 时间:2024/05/05 02:10

listView 分批加载数据,解决的是用户体验问题

复用历史缓存的view对象 converview   减少子孩子id查询的次数

1.改进查询方法,不是一次查询所有数据,而是分批次/分页查询

  

        /** * 查询部分黑名单号码 * @param offset从哪个位置开始获取数据 * @param maxnumber一次最多获取多少条数据 * @return */public List<BlackNumberInfo> findPart(int offset,int maxnumber){try{Thread.sleep(500);} catch (InterruptedException e){// TODO Auto-generated catch blocke.printStackTrace();}List<BlackNumberInfo> result = new ArrayList<BlackNumberInfo>();SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select number,mode from blacknumber order by _id desc limit ? offset ?",new String[]{String.valueOf(maxnumber),String.valueOf(offset)});while(cursor.moveToNext()){BlackNumberInfo info = new BlackNumberInfo();String number = cursor.getString(0);String mode = cursor.getString(1);info.setNumber(number);info.setMode(mode);result.add(info);}cursor.close();db.close();return result;}

2.


private int offset=0;private int maxnumber=20;

@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_call_sms_safe);ll_loading = (LinearLayout) findViewById(R.id.ll_loading);lv_callsms_safe = (ListView) findViewById(R.id.lv_callsms_safe);dao=new BlackNumberDao(this);fillDate();//listview 注册一个滚动事件 的监听器.lv_callsms_safe.setOnScrollListener(new OnScrollListener(){//当滚动的状态发生变化的时候@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState){switch (scrollState){case OnScrollListener.SCROLL_STATE_IDLE://空闲状态System.out.println("空闲状态");//判断当前listView滚动的位置//获取最后一个可见条目在集合里的位置。int lastPosition=lv_callsms_safe.getLastVisiblePosition();//集合里面有20个Item 位置从0开始的最后一个条目的位置 19if(lastPosition == infos.size()-1){offset+=maxnumber;fillDate();}break;case OnScrollListener.SCROLL_STATE_FLING://手指触摸滚动System.out.println("手指触摸滚动");break;case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://惯性滑行状态System.out.println("惯性滑行状态");break;}}//滚动的时候调用的方法@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount){}});}

3.抽取出fillData方法

private void fillDate(){ll_loading.setVisibility(View.VISIBLE);new Thread(){public void run() {if(infos==null){infos = dao.findPart(offset, maxnumber);}else{//原来已经加载过数据了infos.addAll(dao.findPart(offset, maxnumber));}runOnUiThread(new Runnable(){@Overridepublic void run(){ll_loading.setVisibility(View.INVISIBLE);if(adapter ==null){adapter = new CallSmsSafeAdapter();lv_callsms_safe.setAdapter(adapter);}else {adapter.notifyDataSetChanged();}}});};}.start();}

4.显示效果


0 0
原创粉丝点击