一、重用convertView,减少内存消耗
// 这个方法要被执行很多次, 有多个条目 就要执行多少次
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
if (convertView == null) {
view = View.inflate(CallSmsSafeActivity.this,
R.layout.item_callsms, null);
...
} else {
view = convertView; // 使用历史缓存view对象, 减少view对象被创建的次数
...
}
二、使用ViewHolder标记View中的控件,减少搜索对性能的消耗。
根据界面需要定义ViewHolder
class ViewHolder {
TextView tv_phone;
TextView tv_mode;
ImageView iv_delete;
}
在getView中使用ViewHolder
if (convertView == null) {
view = View.inflate(CallSmsSafeActivity.this,
R.layout.item_callsms, null);
holder = new ViewHolder(); // 减少子孩子查询的次数
holder.tv_phone = (TextView) view
.findViewById(R.id.tv_item_phone);
holder.tv_mode = (TextView) view
.findViewById(R.id.tv_item_mode);
holder.iv_delete = (ImageView) view
.findViewById(R.id.iv_delete);
// 把孩子id的引用 存放在holder里面,设置给父亲 view
view.setTag(holder);
} else {
view = convertView; // 使用历史缓存view对象, 减少view对象被创建的次数
holder = (ViewHolder) view.getTag();
}
holder.tv_phone.setText("123456");
...
三、分段加载数据。例如,用户浏览到列表底部再动态加载新的数据。
在滑动静止时加载更多数据
lv_callsms_safe = (ListView) findViewById(R.id.lv_callsms_safe);
lv_callsms_safe.setOnScrollListener(new OnScrollListener() {
// 滚动状态发生变化调用的方法。
// OnScrollListener.SCROLL_STATE_FLING 惯性滑动
// OnScrollListener.SCROLL_STATE_TOUCH_SCROLL 触摸滑动
// OnScrollListener.SCROLL_STATE_IDLE 静止
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE: // 静止状态
// 判断是否是最后一个条目。
int lastPosition = lv_callsms_safe.getLastVisiblePosition();
System.out.println("最后一个可见条目的位置:" + lastPosition);
if (lastPosition == infos.size() - 1) { // //20条数据
// 加载更多的数据。 更改加载数据的开始位置
startIndex += maxCount;
if (startIndex >= totalCount) {
Toast.makeText(getApplicationContext(),
"没有更多的数据了。", 0).show();
return;
}
fillData();
}
break;
}
}
// 只要listview发生滚动 就会调用下面的方法
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
在DAO中使用limit和offset分段搜索sqlite
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select number,mode from blackinfo order by _id desc limit ? offset ?",
new String[]{String.valueOf(maxCount),
String.valueOf(startIndex)
});
List<BlackNumberInfo> blackNumberInfos = new ArrayList<BlackNumberInfo>();