Android初学之listView分批加载数据

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 block
			e.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;

@Override
	protected 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()
		{
			//当滚动的状态发生变化的时候
			@Override
			public 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开始的最后一个条目的位置 19
					if(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;
				}
				
			}
			//滚动的时候调用的方法
			@Override
			public 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()
				{
					
					@Override
					public void run()
					{
						ll_loading.setVisibility(View.INVISIBLE);
						if(adapter ==null)
						{
							adapter = new CallSmsSafeAdapter();
							lv_callsms_safe.setAdapter(adapter);
						}else 
						{
							adapter.notifyDataSetChanged();
						}
						
						
						
					}
				});
			};
			
		}.start();
	}

4.显示效果


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值