标签:android 进程 优化 用户体验 listview
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47281055
在上一篇博文《Android之——杀死用户选中的进程(释放进程占用的空间)》一文中,向大家介绍了如何杀死用户选中的进程,但是,遗留了一个问题,那就是杀死进程后,ListVIew列表没有立即刷新,这篇文章我们就来解决这个问题,优化一下ListView的显示,提升用户体验。我们这篇博文同样是基于上一篇博文来进行优化的,请大家先阅读上一篇博文《Android之——杀死用户选中的进程(释放进程占用的空间)》
这里,我们主要优化的是TaskManagerActivity类中自定义的适配器类,在这个自定义适配器类中,我们增加了一个属性字段List<TaskInfo> infos,这个集合代表的是当前要显示到ListView中的数据集合,同时为这个集合设置一个set方法,当其他地方对数据集合进行了更改的时候,比如,添加或者移出了集合中的数据,只要调用自定义适配器的set方法即可将更新后的list集合传递到自定义适配器类中,同时,调用ListView的notifyDataSetChanged()方法即可刷新ListView页面。
在这个自定义适配器类中,我们增加了一个属性字段List<TaskInfo> infos,这个集合代表的是当前要显示到ListView中的数据集合,同时为这个集合设置一个set方法,当其他地方对数据集合进行了更改的时候,比如,添加或者移出了集合中的数据,只要调用自定义适配器的set方法即可将更新后的list集合传递到这个自定义适配器类中。
具体实现代码如下:
/** * 自定义适配器 * @author liuyazhuang * */ private class TaskManagerAdapter extends BaseAdapter{ private LayoutInflater mInflater; private List<TaskInfo> infos; public void setInfos(List<TaskInfo> infos) { this.infos = infos; } public TaskManagerAdapter(){ mInflater = getLayoutInflater(); } @Override public int getCount() { return infos.size(); } @Override public Object getItem(int position) { return infos.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; ViewHolder holder = null; if(convertView != null){ view = convertView; holder = (ViewHolder) view.getTag(); }else{ view = mInflater.inflate(R.layout.task_manager_item, null); holder = new ViewHolder(); holder.iv_task_manager_icon = (ImageView) view.findViewById(R.id.iv_task_manager_icon); holder.iv_task_manager_name = (TextView) view.findViewById(R.id.tv_task_manager_name); holder.iv_task_manager_memory = (TextView) view.findViewById(R.id.tv_task_manager_memory); //获取到UI上的CheckBox控件 holder.cb_task_manager_selected = (CheckBox) view.findViewById(R.id.cb_task_manager_selected); view.setTag(holder); } TaskInfo taskInfo = infos.get(position); holder.iv_task_manager_icon.setImageDrawable(taskInfo.getTask_icon()); holder.iv_task_manager_memory.setText("占用的内存:"+TextFormat.formatByte(taskInfo.getTask_memory()*1024)); holder.iv_task_manager_name.setText(taskInfo.getTask_name()); String packageName = taskInfo.getPackageName(); //应用程序是当前运行的程序 if(packageName.equals(getPackageName())){ holder.cb_task_manager_selected.setVisibility(View.GONE); }else{ holder.cb_task_manager_selected.setVisibility(View.VISIBLE); } //获取条目的选中状态 boolean isChecked = taskInfo.isChecked(); if(isChecked){ holder.cb_task_manager_selected.setChecked(true); }else{ holder.cb_task_manager_selected.setChecked(false); } return view; } }
这里由于我们更新了自定义适配器类,其中显示的数据设置方式发生了变化,所以,我们也要更新一下默认进程列表的显示方式,我们在Handler实例化自定义适配器类TaskManagerAdapter后,需要手动将进程列表集合set到这个类中的list属性字段中,然后调用ListView的notifyDataSetChanged()方法刷新列表显示。
具体代码如下:
private Handler mHandler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case SUCCESS_GETTASKINFO: long total = TaskUtils.getAvailMem(TaskManagerActivity.this); for(TaskInfo info : taskInfos){ total += info.getTask_memory() * 1024; } //可用内存 String availMemStr = TextFormat.formatByte(TaskUtils.getAvailMem(TaskManagerActivity.this)); //总内存 String totalMemStr = TextFormat.formatByte(total); tv_task_manager_task_memory.setText("可用/总内存:"+availMemStr+"/"+totalMemStr); mAdapter = new TaskManagerAdapter(); mAdapter.setInfos(taskInfos); rl_loading.setVisibility(View.GONE); lv_taskmanage.setAdapter(mAdapter); break; default: break; } }; };
在这个方法中,我们新创建了一个list集合,用来存放没有被杀死的进程,处理完后,将这个没有被杀死的进程集合set给自定义适配器类TaskManagerAdapter的list集合,然后调用ListView的notifyDataSetChanged()方法刷新列表显示。
注意:遍历集合的时候,是不能对集合进行增、删、改操作的。
具体代码如下:
/** * 杀死进程 * @param v */ public void kill_process(View v){ //存放没有被杀死的进程 List<TaskInfo> newTaskInfos = new ArrayList<TaskInfo>(); for(TaskInfo taskInfo : taskInfos){ if(taskInfo.isChecked()){ //杀死选中的进程 am.killBackgroundProcesses(taskInfo.getPackageName()); }else{ newTaskInfos.add(taskInfo); } } mAdapter.setInfos(newTaskInfos); mAdapter.notifyDataSetChanged(); }
本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:android 进程 优化 用户体验 listview
原文地址:http://blog.csdn.net/l1028386804/article/details/47281055