自定义继承管理适配器:
这个适配器是重点,与以往我写的适配器有所不同,她的item不是都是一样的,
一个是显示头部:此类型的进程数目app_lv_head_item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/app_tv_header" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#5e5e5e" android:padding="5dp" android:text="用户应用(0)" android:textColor="@android:color/white" android:textSize="18sp" /> </LinearLayout>
另一个是显示具体进程信息
app_lv_item.xml
为了item和item内部控件CheckBox具有各自的点击事件,要将checkbox
设置为 android:focusable="false"
否则item没有点击效果
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:id="@+id/apm_lv_item_iv1" android:layout_gravity="center_vertical" android:layout_width="45dp" android:layout_height="45dp" android:background="@drawable/ic_launcher" /> <LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_gravity="center_vertical" android:gravity="center_vertical" android:orientation="vertical" > <TextView android:id="@+id/apm_lv_item_tv1" android:layout_width="wrap_content" android:layout_height="0dp" android:paddingBottom="10dp" android:layout_weight="1" android:text="应用名称" /> <TextView android:id="@+id/apm_lv_item_tv2" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_weight="1" android:text="内存大小" /> </LinearLayout> <CheckBox android:layout_gravity="center_vertical" android:id="@+id/apm_lv_item_cb1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:checked="false" android:visibility="gone" android:focusable="false" /> </LinearLayout>
具体效果:
普通自定义的适配器的item都是一致的,
所以只需要重写四个方法:
getCount()
getItem()
getItemId
getView
现在item变成了两种,要重写两个方法,根据item类型与位置
在getView中显示不同的item
@Override public int getViewTypeCount() {//获取视图类型数目, //正常情况下,所有的item视图都是一样的, 默认返回1 return 2; } @Override public int getItemViewType(int position) {//获取视图类型 //在这两个位置显示的是进程类型和总数的头部 if(position == 0 || position == mUserProcess.size()+1){ return 0; }else { return 1;//显示进程item } }
package com.chb.myphonesave.adapter; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.text.format.Formatter; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import com.chb.myphonesave.R; import com.chb.myphonesave.entity.ProcessInfo; import com.chb.myphonesave.util.PreferencesUtils; public class ProgressInfoAdapter extends BaseAdapter { private List<ProcessInfo> list; private List<ProcessInfo> mProcess; //所有的继承 private List<ProcessInfo> mUserProcess;//用户进程 private List<ProcessInfo> mSystemProcess;//系统进程 private LayoutInflater lInflater; private Context context; public List<ProcessInfo> getUserProcess() { return mUserProcess; } /** * * @param context 上下文, * @param list 所有的正在运行中的进程 */ public ProgressInfoAdapter(Context context, List<ProcessInfo> list) { this.context = context; lInflater = LayoutInflater.from(context); this.list = list; mProcess = this.list; mUserProcess = new ArrayList<ProcessInfo>(); mSystemProcess = new ArrayList<ProcessInfo>(); for (ProcessInfo pinfo :mProcess) { if(pinfo.isUserProcess){//用户进程 mUserProcess.add(pinfo); }else {//系统进程 mSystemProcess.add(pinfo); } } } @Override public int getCount() { //是否显示系统进程 boolean showSystem = PreferencesUtils.getBoolean(context, "process_show_system", true); if(showSystem){ //为什么显示加2 return mUserProcess.size()+mSystemProcess.size()+2; }else {//只显示一个用户进程总数的头部,和用户进程 return mUserProcess.size()+1; } } @Override public ProcessInfo getItem(int position) { //在第一个item获取,显示完用户进程的下一个item是显示当前类型的进程的总数目 if(position == 0 || position == mUserProcess.size()+1){ return null; }else if(position < mUserProcess.size()+1) { return mUserProcess.get(position - 1); }else {//获取系统进程 return mSystemProcess.get(position - 2 - mUserProcess.size()); } } @Override public int getViewTypeCount() {//获取视图类型数目, //正常情况下,所有的item视图都是一样的, 默认返回1 return 2; } @Override public int getItemViewType(int position) {//获取视图类型 //在这两个位置显示的是进程类型和总数的头部 if(position == 0 || position == mUserProcess.size()+1){ return 0; }else { return 1;//显示进程item } } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { int type = getItemViewType(position);//当前位置显示类型 ViewHandler vhaHandler = null; HeadHandler headHandler = null; switch (type) { case 0://显示头部 if(convertView == null){ headHandler = new HeadHandler(); convertView = lInflater.inflate(R.layout.apm_lv_head_item, null); headHandler.tv_header = (TextView) convertView.findViewById(R.id.app_tv_header); convertView.setTag(headHandler); }else { headHandler = (HeadHandler)convertView.getTag(); } //设置属性 //Log.i("tag", position +">>>"+ mUserProcess+">>"+headHandler); if(position == 0){ headHandler.tv_header.setText("用户进程:("+mUserProcess.size()+")"); }else { headHandler.tv_header.setText("系统进程:("+mSystemProcess.size()+")"); } break; case 1: if(convertView == null){ vhaHandler = new ViewHandler(); convertView = lInflater.inflate(R.layout.apm_lv_item, null); vhaHandler.iv = (ImageView) convertView.findViewById(R.id.apm_lv_item_iv1); vhaHandler.tv1 = (TextView) convertView.findViewById(R.id.apm_lv_item_tv1); vhaHandler.tv2 = (TextView) convertView.findViewById(R.id.apm_lv_item_tv2); vhaHandler.cb1 = (CheckBox) convertView.findViewById(R.id.apm_lv_item_cb1); convertView.setTag(vhaHandler); }else { vhaHandler = (ViewHandler)convertView.getTag(); } //设置属性 ProcessInfo info = getItem(position); vhaHandler.iv.setImageDrawable(info.getIcon()); vhaHandler.tv1.setText(info.getPackageName()); vhaHandler.tv2.setText(Formatter.formatFileSize(context, info.getMomery())); if (info.isChecked()) { vhaHandler.cb1.setVisibility(View.VISIBLE); vhaHandler.cb1.setChecked(true); }else {//checkbox 默认gone vhaHandler.cb1.setVisibility(View.GONE); vhaHandler.cb1.setChecked(false); } break; default: break; } return convertView; } class ViewHandler { ImageView iv; TextView tv1; TextView tv2; CheckBox cb1; } class HeadHandler { TextView tv_header; //ListView头部的显示系统进程获取用户进程 } }
时间: 2024-10-10 04:05:06