转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47281055

在上一篇博文《Android之——杀死用户选中的进程(释放进程占用的空间)》一文中,向大家介绍了如何杀死用户选中的进程,但是,遗留了一个问题,那就是杀死进程后,ListVIew列表没有立即刷新,这篇文章我们就来解决这个问题,优化一下ListView的显示,提升用户体验。我们这篇博文同样是基于上一篇博文来进行优化的,请大家先阅读上一篇博文《Android之——杀死用户选中的进程(释放进程占用的空间)》

一、原理

这里,我们主要优化的是TaskManagerActivity类中自定义的适配器类,在这个自定义适配器类中,我们增加了一个属性字段List<TaskInfo> infos,这个集合代表的是当前要显示到ListView中的数据集合,同时为这个集合设置一个set方法,当其他地方对数据集合进行了更改的时候,比如,添加或者移出了集合中的数据,只要调用自定义适配器的set方法即可将更新后的list集合传递到自定义适配器类中,同时,调用ListView的notifyDataSetChanged()方法即可刷新ListView页面。

二、实现

1、更新自定义适配器TaskManagerAdapter

在这个自定义适配器类中,我们增加了一个属性字段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();}@Overridepublic int getCount() {return infos.size();}@Overridepublic Object getItem(int position) {return infos.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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;}}

2、更新Handler

这里由于我们更新了自定义适配器类,其中显示的数据设置方式发生了变化,所以,我们也要更新一下默认进程列表的显示方式,我们在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;}};};

3、更新“一键清理”的点击事件

在这个方法中,我们新创建了一个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程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

更多相关文章

  1. [置顶] AIDL使用以及原理分析
  2. Android(安卓)外观模式
  3. 对在Android的状态栏添加Menu,Back,Home的改进
  4. Android(安卓)IPC机制(二)——利用Messenger实现跨进程通信
  5. Android(安卓)Bluetooth 蓝牙开发资料大全【新】
  6. Android的SQLite使用实例
  7. Java集合框架——Android中的ArrayList源码分析
  8. Android之路之十七(重要组件之Service)
  9. Fedora17 64位 android "failed to create the SD card" 解决方

随机推荐

  1. android中进度条―基础篇
  2. OpenCV Android解决相机旋转90度及全屏问
  3. android 禁止Viewpager左右滑动功能
  4. android init 进程分析 (4 属性服务)
  5. 第三方Android(安卓)软件商店:现状和思考
  6. Android(安卓)警告提示:Activity has leak
  7. Android上下文服务管理查询过程
  8. Android(安卓)UI设计:ImageView
  9. android,java实现NanoHTTPD 轻量级 服务器
  10. Android在shell环境下运行linux命令