ListView抽象化
抽象化,虚拟话
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";@Overridepublic 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 ;}}@Overridepublic 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;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}}static class ViewHolder {ImageView iv_icon;TextView tv_name;TextView tv_memsize;CheckBox cb_status;}


浙公网安备 33010602011771号