zoukankan      html  css  js  c++  java
  • 026 Android 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+读取内存空间、手机进程信息+常驻悬浮框

    1.目标效果

    带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+常驻悬浮框

    2.页面布局文件

    (1)activity_process_manager.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".ProcessManagerActivity">
    
        <TextView
            style="@style/TitleStyle"
            android:text="进程管理" />
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp">
            <TextView
                android:id="@+id/tvPM_process_number"
                android:text="进程总数"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
    
            <TextView
                android:id="@+id/tvPM_memory_info"
                android:layout_alignParentRight="true"
                android:text="剩余/总共"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </RelativeLayout>
    
        <!--利用帧布局实现常驻悬浮框的效果(需要配合java后台代码)-->
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">
    
            <!--让listview占满页面的剩余部分-->
            <ListView
                android:id="@+id/lv_process_manager"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
            </ListView>
    
            <TextView
                android:background="#ccc"
                android:id="@+id/tv_des"
                android:textColor="#000"
                android:textSize="18dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
        </FrameLayout>
    
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <Button
                android:id="@+id/btPM_all_select"
                android:text="全选"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"/>
    
            <Button
                android:id="@+id/btPM_reverse_select"
                android:text="反选"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"/>
    
    
            <Button
                android:id="@+id/btPM_setting"
                android:text="设置"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"/>
        </LinearLayout>
    </LinearLayout>

    (2)listview_process_manager_item_title

    <?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">
    
        <TextView
            android:padding="5dp"
            android:id="@+id/tvAM_title"
            android:text="标题"
            android:textColor="#000"
            android:background="@color/gray"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    (3)listview_process_manager_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">
    
        <ImageView
            android:id="@+id/iv_app_icon"
            android:layout_centerVertical="true"
            android:background="@mipmap/ic_launcher"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <TextView
            android:layout_marginTop="5dp"
            android:id="@+id/tvLV_name"
            android:text="应用名称"
            android:textColor="#000000"
            android:textSize="18dp"
            android:layout_toRightOf="@+id/iv_app_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/tvLV_memory_info"
            android:text="占用内存大小"
            android:textColor="#000000"
            android:layout_marginTop="10dp"
            android:textSize="18dp"
            android:layout_below="@+id/tvLV_name"
            android:layout_toRightOf="@+id/iv_app_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    
        <CheckBox
            android:id="@+id/cb_process_manager"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:clickable="false"
            android:focusableInTouchMode="false"
            android:focusable="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </RelativeLayout>

    3.java后台代码

    package com.example.administrator.test62360safeguard;
    
    import android.annotation.SuppressLint;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.format.Formatter;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AbsListView;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
    
    import com.example.administrator.test62360safeguard.Entity.AppInfoBean;
    import com.example.administrator.test62360safeguard.Entity.ProcessInfoBean;
    import com.example.administrator.test62360safeguard.engine.AppInfoProvider;
    import com.example.administrator.test62360safeguard.engine.ProcessInfoProvider;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ProcessManagerActivity extends AppCompatActivity {
    
        private TextView tvPM_process_number;
        private TextView tvPM_memory_info;
        private ListView lv_process_manager;
        Button btPM_all_select;
        Button btPM_reverse_select;
        Button btPM_setting;
        List<ProcessInfoBean> processInfoList;
        List<ProcessInfoBean> systemProcessInfoList;
        List<ProcessInfoBean> customerProcessInfoList;
    
        @SuppressLint("HandlerLeak")
        Handler handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                lv_process_manager.setAdapter(new MyAdapter());
                if(customerProcessInfoList!=null){
                    tv_des.setText("用户进程("+customerProcessInfoList.size()+")");
                }
            }
        };
        private TextView tv_des;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_process_manager);
    
            initUI();
            initTitleData();
            initList();
        }
    
        private void initList() {
            lv_process_manager = findViewById(R.id.lv_process_manager);
            new Thread(){
                @Override
                public void run() {
                    processInfoList = ProcessInfoProvider.getProcessInfo(getApplicationContext());
                    systemProcessInfoList = new ArrayList<>();
                    customerProcessInfoList = new ArrayList<>();
                    for (ProcessInfoBean processInfoBean : processInfoList) {
                        if(processInfoBean.isSystem){
                            //系统进程
                            systemProcessInfoList.add(processInfoBean);
                        }else {
                            //用户进程
                            customerProcessInfoList.add(processInfoBean);
                        }
                    }
                    handler.sendEmptyMessage(0);
                }
            }.start();
        }
    
        private void initTitleData() {
            int processCount = ProcessInfoProvider.getProcessCount(this);
            tvPM_process_number.setText("进程总数:"+processCount);
    
            //获取可用内存大小,并且格式化
            long availSpace = ProcessInfoProvider.getAvailSpace(this);
            String availSpaceStr = Formatter.formatFileSize(this, availSpace);
    
            //获取运行内存大小,并且格式化
            long totalSpace = ProcessInfoProvider.getTotalSpace(this);
            String totalSpaceStr = Formatter.formatFileSize(this, totalSpace);
            tvPM_memory_info.setText("剩余/总共:"+availSpaceStr+"/"+totalSpaceStr);
    
        }
    
        private void initUI() {
            tvPM_process_number = findViewById(R.id.tvPM_process_number);
            tvPM_memory_info = findViewById(R.id.tvPM_memory_info);
            lv_process_manager = findViewById(R.id.lv_process_manager);
            btPM_all_select = findViewById(R.id.btPM_all_select);
            btPM_reverse_select = findViewById(R.id.btPM_reverse_select);
            btPM_setting = findViewById(R.id.btPM_setting);
            tv_des = findViewById(R.id.tv_des);
    
            btPM_all_select.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            });
    
            btPM_all_select.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            });
    
            btPM_setting.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            });
    
            //给listview设置滚动监听事件,实现常驻悬浮框的效果
            lv_process_manager.setOnScrollListener(new AbsListView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(AbsListView view, int scrollState) {
    
                }
                @Override
                public void onScroll(AbsListView view, int firstVisibleItem,
                                     int visibleItemCount, int totalItemCount) {
                    //滚动过程中调用方法
                    //AbsListView中view就是listView对象
                    //firstVisibleItem第一个可见条目索引值
                    //visibleItemCount当前一个屏幕的可见条目数
                    //总共条目总数
                    if(customerProcessInfoList!=null && systemProcessInfoList!=null){
                        if(firstVisibleItem>=customerProcessInfoList.size()+1){
                            //滚动到了系统条目
                            tv_des.setText("系统进程("+systemProcessInfoList.size()+")");
                        }else{
                            //滚动到了用户应用条目
                            tv_des.setText("用户进程("+customerProcessInfoList.size()+")");
                        }
                    }
    
                }
            });
        }
    
        /**
         * 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)
         */
        private class MyAdapter extends BaseAdapter {
            //获取适配器中条目类型的总数,此处修改为两种(纯文本,图片+文字)
            @Override
            public int getViewTypeCount() {
                return super.getViewTypeCount()+1;
            }
    
            //指定索引指向的条目类型,条目类型状态码指定(0(复用系统),1)
            @Override
            public int getItemViewType(int position) {
                if(position==0||position==customerProcessInfoList.size()+1){
                    //返回0,代表纯文字的状态码
                    return 0;
                }else {
                    //返回1,代表图片+文字状态码
                    return 1;
                }
            }
    
            //给listview添加两个描述条目
            @Override
            public int getCount() {
                return systemProcessInfoList.size()+customerProcessInfoList.size()+2;
            }
    
            @Override
            public ProcessInfoBean getItem(int position) {
                //因为加了两个描述条目后,条目的顺序发生了改变
                if(position==0||position==customerProcessInfoList.size()+1){
                    return null;
                }else {
                    if(position<customerProcessInfoList.size()+1){
                        return customerProcessInfoList.get(position-1);
                    }else {
                        return systemProcessInfoList.get(position-customerProcessInfoList.size()-2);
                    }
                }
    
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                int type=getItemViewType(position);
                if(type==0){
                    //在position==0或position==customerAppInfoList.size()+1这两处展示纯文本条目
                    //采用优化后的listview
                    ViewTitleHolder viewTitleHolder=null;
                    if(convertView==null){
                        convertView=View.inflate(getApplicationContext(),R.layout.listview_app_manager_item_title,null);
                        viewTitleHolder=new ViewTitleHolder();
                        viewTitleHolder.tvAM_title = convertView.findViewById(R.id.tvAM_title);
                        convertView.setTag(viewTitleHolder);
                    }else {
                        viewTitleHolder= (ViewTitleHolder) convertView.getTag();
                    }
                    if(position==0){
                        viewTitleHolder.tvAM_title.setText("用户进程("+customerProcessInfoList.size()+")");
                    }else {
                        viewTitleHolder.tvAM_title.setText("系统进程("+systemProcessInfoList.size()+")");
                    }
                    return convertView;
                }else {
                    //展示图片+文字条目
                    //采用优化后的listview
                    ViewHolder viewHolder=null;
                    if(convertView==null){
                        convertView=View.inflate(getApplicationContext(),R.layout.listview_process_manager_item,null);
                        viewHolder=new ViewHolder();
                        viewHolder.iv_app_icon = convertView.findViewById(R.id.iv_app_icon);
                        viewHolder.tvLV_name = convertView.findViewById(R.id.tvLV_name);
                        viewHolder.tvLV_memory_info= convertView.findViewById(R.id.tvLV_memory_info);
                        viewHolder.cb_process_manager=convertView.findViewById(R.id.cb_process_manager);
                        convertView.setTag(viewHolder);
                    }else {
                        viewHolder= (ViewHolder) convertView.getTag();
                    }
                    viewHolder.iv_app_icon.setBackgroundDrawable(getItem(position).icon);
                    viewHolder.tvLV_name.setText(getItem(position).name);
                    String sizeStr = Formatter.formatFileSize(getApplicationContext(), getItem(position).memSize);
                    viewHolder.tvLV_memory_info.setText(sizeStr);
                    //如果包名为当前应用,则隐藏checkbox
                    if(getItem(position).packageName.equals(getPackageName())){
                        viewHolder.cb_process_manager.setVisibility(View.GONE);
                    }else {
                        viewHolder.cb_process_manager.setVisibility(View.VISIBLE);
                    }
                    viewHolder.cb_process_manager.setChecked(getItem(position).isCheck);
                    return convertView;
                }
            }
    
            private class ViewHolder {
                ImageView iv_app_icon;
                TextView tvLV_name;
                TextView tvLV_memory_info;
                CheckBox cb_process_manager;
            }
    
            private class ViewTitleHolder {
                TextView tvAM_title;
            }
        }
    }

    4.效果图

  • 相关阅读:
    React组件化编程
    React入门
    typeof与instanceof比较+undefined与null各种值的相互比较
    JavaScript 数组去重
    JavaScript数组降维
    了解JS单线程和任务队列!
    clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
    ES6—Set和Map
    数组+排序--知识点总结
    java scanner
  • 原文地址:https://www.cnblogs.com/luckyplj/p/10856586.html
Copyright © 2011-2022 走看看