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.显示效果