編輯:關於Android編程
在上一篇博文《Android之——殺死用戶選中的進程(釋放進程占用的空間)》一文中,向大家介紹了如何殺死用戶選中的進程,但是,遺留了一個問題,那就是殺死進程後,ListVIew列表沒有立即刷新,這篇文章我們就來解決這個問題,優化一下ListView的顯示,提升用戶體驗。我們這篇博文同樣是基於上一篇博文來進行優化的,請大家先閱讀上一篇博文《Android之——殺死用戶選中的進程(釋放進程占用的空間)》
這裡,我們主要優化的是TaskManagerActivity類中自定義的適配器類,在這個自定義適配器類中,我們增加了一個屬性字段List
在這個自定義適配器類中,我們增加了一個屬性字段List
具體實現代碼如下:
/** * 自定義適配器 * @author liuyazhuang * */ private class TaskManagerAdapter extends BaseAdapter{ private LayoutInflater mInflater; private Listinfos; public void setInfos(List 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){ //存放沒有被殺死的進程 ListnewTaskInfos = new ArrayList (); for(TaskInfo taskInfo : taskInfos){ if(taskInfo.isChecked()){ //殺死選中的進程 am.killBackgroundProcesses(taskInfo.getPackageName()); }else{ newTaskInfos.add(taskInfo); } } mAdapter.setInfos(newTaskInfos); mAdapter.notifyDataSetChanged(); }
本實例中,為了方面,我把一些文字直接寫在了布局文件中和相關的類中,大家在真實的項目中要把這些文字寫在string.xml文件中,在外部引用這些資源,切記,這是作為一個Android程序員最基本的開發常識和規范,我在這裡只是為了方便直接寫在了類和布局文件中。
本文根據自己的實踐總結而來,參考前人博客之余,也自己總結和開發了一些功能,在這裡給自己備份也分享給大家。不同之處在於:自動打開並搜索藍牙、修改藍牙名字、完整接收藍牙傳輸
做過電商類應用的朋友可能都會遇到一個比較頭疼的問題:復雜的首頁布局如何實現。參考百度糯米,美團,bilibili等應用,都會發現其首頁的布局相對復雜,例如下圖bilibi
ListView是App開發中最常見的控件之一了,與之相隨的則是BaseAdapter的使用,BaseAdapter的作用則是為我們的ListView提供數據源,普通的用
新項目需要做短信模塊功能,此短信模塊非安卓系統短信模塊,是利用了360張勇主導的開源框架,進行URL攔截,剝離出來的短信模塊第一步:去下載安卓系統源碼,通過對比4.4和4