我的手机管家 进程管理适配器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的手机管家 进程管理适配器相关的知识,希望对你有一定的参考价值。

自定义继承管理适配器:

  这个适配器是重点,与以往我写的适配器有所不同,她的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头部的显示系统进程获取用户进程
    }

}

 

以上是关于我的手机管家 进程管理适配器的主要内容,如果未能解决你的问题,请参考以下文章

我的手机管家 进程管理逻辑代码

我的手机管家(17) 应用管理 获取安装的应用程序

我的手机管家骚扰拦截 适配器

我的手机管家(16) 应用管理 界面设计

我的手机管家(11) 网络助手 界面设计及适配器

我的手机管家(18) 应用管理 主要代码