抽象化,虚拟话
getView(^^^^):在这里判断ViewHolder是否为空,进行初始化Holder,加载View,初始化view ,设置标记,若有复用,直接从标记中拿出来aaa;设置数据
class ViewHolder{
//写listview中item布局里面的元素
}
嵌套checkbox
主要写重写两个方法
数据多的话,需要 listview 分批
修改数据库方法,加入参数(起始位置,和最大位置)
select num,mode from blacknumber order by _id desc limit 14 offset 10 (注意这里的书写顺序不能颠倒,表示从第十个位置开始,输出14个元素)
select num,mode from blacknumber order by _id desc limit ?offset ? ,new String[]{String.valueOf(maxnumber),String.valueOf(offset) }
也可以这么写(不标准)
滚动事件的监听器 setOnScrollListener (在空闲状态,惯性,手指触摸)
获得最后一个数据的位置
int lastVisiblePosition = view.getLastVisiblePosition(); |
当移动到最后一个位置时,那么起始位置更新为第一次最大的位置,同理,递归
往回滚的时候,出现了旧的的数据不见了---》分批
(需要判断, 若加载过数据 ,新数据要加在集合末尾 .addAll( ) )
但是一加载数据后界面又回到第一条,(适配器问题,加入判断,若适配器已经存在了, 需要更新适配器notifyDataSetChanged() )
若存太多对象不能用分批技术(内存开销太大,每一个对象都是会占内存的),需要分页技术(新获得的数据替换旧的数据)
1.复用历史缓存的view对象 converview
2.减少子孩子id查询的次数 getTag
3.分批的加载数据
4.分页的加载数据
代码
private class TaskManagerAdapter extends BaseAdapter {
private static final String TAG = "TaskManagerAdapter";
@Override
public int getCount() {
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
if (sp.getBoolean("showsystem", false)) {
return userTaskInfos.size() + 1 + systemTaskInfos.size() + 1;
}else{
return userTaskInfos.size() + 1 ;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TaskInfo taskInfo;
if (position == 0) {// 用户进程的标签
TextView tv = new TextView(getApplicationContext());
tv.setBackgroundColor(Color.GRAY);
tv.setTextColor(Color.WHITE);
tv.setText("用户进程:" + userTaskInfos.size() + "个");
return tv;
} else if (position == (userTaskInfos.size() + 1)) {
TextView tv = new TextView(getApplicationContext());
tv.setBackgroundColor(Color.GRAY);
tv.setTextColor(Color.WHITE);
tv.setText("系统进程:" + systemTaskInfos.size() + "个");
return tv;
} else if (position <= userTaskInfos.size()) {
taskInfo = userTaskInfos.get(position - 1);
} else {
taskInfo = systemTaskInfos.get(position - 1
- userTaskInfos.size() - 1);
}
View view;
ViewHolder holder;
if (convertView != null && convertView instanceof RelativeLayout) {
view = convertView;
holder = (ViewHolder) view.getTag();
Log.i(TAG, "复用缓存。。" + position);
} else {
view = View.inflate(getApplicationContext(),
R.layout.list_item_taskinfo, null);
holder = new ViewHolder();
holder.iv_icon = (ImageView) view
.findViewById(R.id.iv_task_icon);
holder.tv_name = (TextView) view
.findViewById(R.id.tv_task_name);
holder.tv_memsize = (TextView) view
.findViewById(R.id.tv_task_memsize);
holder.cb_status = (CheckBox) view.findViewById(R.id.cb_status);
view.setTag(holder);
Log.i(TAG, "创建新的view对象" + position);
}
holder.iv_icon.setImageDrawable(taskInfo.getIcon());
holder.tv_name.setText(taskInfo.getName());
holder.tv_memsize.setText("内存占用:"
+ Formatter.formatFileSize(getApplicationContext(),
taskInfo.getMemsize()));
holder.cb_status.setChecked(taskInfo.isChecked());
if (getPackageName().equals(taskInfo.getPackname())) {
holder.cb_status.setVisibility(View.INVISIBLE);
} else {
holder.cb_status.setVisibility(View.VISIBLE);
}
return view;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
static class ViewHolder {
ImageView iv_icon;
TextView tv_name;
TextView tv_memsize;
CheckBox cb_status;
}