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.效果图

  • 相关阅读:
    20200226 Java IO流——廖雪峰
    20200225 Java 多线程(2)-廖雪峰
    20200225 Java 多线程(1)-廖雪峰
    20200224 尚硅谷ElasticSearch【归档】
    20200224 一 概述
    20200222 尚硅谷Dubbo【归档】
    20200222 四、dubbo原理
    Improved robustness of reinforcement learning policies upon conversion to spiking neuronal network platforms applied to Atari Breakout game
    Reinforcement learning in populations of spiking neurons
    Solving the Distal Reward Problem through Linkage of STDP and Dopamine Signaling
  • 原文地址:https://www.cnblogs.com/luckyplj/p/10856586.html
Copyright © 2011-2022 走看看