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

自定义继承管理适配器:

  这个适配器是重点,与以往我写的适配器有所不同,她的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

我的手机管家(3) 进程管理适配器的相关文章

类似腾讯手机管家应用源码完整版

类似腾讯手机管家应用源码,也是自己写的android手机管家,内附源代码,应用实现了手机防功能,通信卫士功能,软件管家,进程管理,手机杀毒等功能,里面的图片部分用到了腾讯手机管家的图片,所以跟腾讯手机管家应用比较类似了,大家可以参考一下,可能有的功能还没有那么完善,不过大家可以再这个基础上进行升级,创新,增加自己的特色吧.或者大家可以看看安装演示版(附件下面) 源码项目下载:http://code.662p.com/view/8982.html <ignore_js_op> <ignor

类似腾讯手机管家应用android源码

类似腾讯手机管家应用源码,也是自己写的android手机管家,内附源代码,应用实现了手机防功能,通信卫士功能,软件管家,进程管理,手机杀毒等功能,里面的图片部分用到了腾讯手机管家的图片,所以跟腾讯手机管家应用比较类似了,大家可以参考一下,可能有的功能还没有那么完善,不过大家可以再这个基础上进行升级,创新,增加自己的特色吧.或者大家可以看看安装演示版(附件下面) <ignore_js_op> <ignore_js_op> <ignore_js_op> <ignore

我的手机管家(2) 进程管理布局

我的手机管家(2)  进程管理 (1)获取进程信息:所有的进程信息, 正在运行的进程信息, 剩余可用内存 (2)获取进程信息是一个耗时的操作, 首先在使用子线程获取进程信息的时候显示缓冲界面,缓冲加载完成后, 通知LIstView展示数据,加载适配器, 同时缓冲结束 获取进程信息的提供者: package com.ejob.phonesafe.provider; import java.io.BufferedReader; import java.io.FileReader; import ja

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

本节主要介绍进程管理界面的逻辑代码:至此进程管理的功能已经完善了 首先要加载正在运行的进程,获取进程信息, 这是一个耗时的操作, 所以一个子线程来处理缓冲加载, 加载完数据就通知ListView 将数据展示到 界面,listview怎么知道,数据缓冲完了,如何获取这个通知呢? 不错就是使用Thread和Handler结合,在缓冲完成后,使用handler发送一个 空消息 handler.sendEmptyMessage(1); /** * 缓冲加载进程数据 */ private void ini

手机卫士09_应用程序四种查看_ListView小标题_进程管理

1.悬浮窗体的功能实现: 1.1.应用程序的卸载: 包安装器 packageInstall,包卸载packageruninstall intent.setData(Uri.pare(“package:” + 应用程序包名)) 卸载完之后记得更新list集合,更新适配器. 但是不确定用户是否点了卸载,所以要通过广播获取消息. 并且需要通过代码注册,因为这个广播只在应用管理生效. 要记得addDataSchme(“package”) 接收完广播之后,更新了集合适配器,要记得关闭广播 异常:Concu

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

我的手机管家(11)   网络助手  界面设计 使用一个 <SlidingDrawer>标签用来布局一个抽屉样式 两个属性要注意: 一个是内容布局id,   手柄id android:content="@+id/content" android:handle="@+id/handle" android:orientation="vertical" 抽出的方向 <SlidingDrawer android:id="@+i

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

与进程管理的区别是: 进程只是查询内存中的正在运行的应用程序 而应用管理是查询所有Data和Sdk卡中的应用程序 通过PackageManager 来获取已经安装了的应用程序 PackageManager    贯穿了进程管理, 缓存清除, 应用管理 AppInfo 用来存储获取的应用信息, public class AppInfo { private Drawable icon; private String appName; private String packageName; priva

我的手机管家(19) 应用管理 单独介绍一下PopupWindow

我的手机管家(19) 应用管理  单独介绍一下PopupWindow 在前一节中使用点击ListView 出现一个弹出窗口, 用来显示我们的需求. PopupWindow: A popup window that can be used to display an arbitrary view. The popup window is a floating container that appears on top of the current activity. PopupWindow 是一个

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

应用管理的界面与进程管理的界面是一样的, 只是增加一个ListView点击弹出PopupWindow <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android