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

026 Android 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+读取内存空间、手机进程信息+常驻悬浮框的更多相关文章

  1. 【Android基础】listview控件的使用(3)------Map与SimpleAdapter组成的多显示条目的Listview

    前面介绍的两种listview的使用都是最基础的,所以有很大的局限性,比如只能在一个item(即每一行的条目)中显示一个文本信息,这一篇我将介绍Map与SimpleAdapter组成的多显示条目的Li ...

  2. 14.不同条目的listview

    分类界面 整个项目的逻辑就是这样的 CategoryInfo  public class CategoryInfo { private String title; private String url ...

  3. Android悬浮框,在Service中打开悬浮窗;在Service中打开Dialog;

    文章介绍了如何在Service中显示悬浮框,在Service中弹出Dialog,在Service中做耗时的轮询操作: 背景需求: 公司的项目现在的逻辑是这样的:发送一个指令,然后3秒一次轮询去查询这个 ...

  4. [Delphi]带进度条的ListView

    带进度条的ListView unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, C ...

  5. Android View 之进度条+拖动条+星级评论条....

    PS:将来的你会感谢现在奋斗的自己.... 学习内容: 1.进度条 2.拖动条 3.星级评论条 1.进度条...       进图条这东西想必大家是很熟悉的...为了使用户不会觉得应用程序死掉了,因此 ...

  6. Android开发之漫漫长途 XIV——ListView

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  7. Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...

  8. Android实现页面跳转、ListView及其事件

    Android实现页面跳转.ListView及其事件 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 进入主页面后,使用ListView实现特 ...

  9. Android 自学之进度条ProgressBar

    进度条(ProgressBar)也是UI界面中的一种非常使用的组件,通常用于向用户显示某个耗时完成的百分比.因此进度条可以动态的显示进度,因此避免长时间地执行某个耗时操作时,让用户感觉程序失去了响应, ...

随机推荐

  1. Java 基础:Map的一家

    0.Java中的集合框架 1.Map--接口 public interface Map<K,V> 包:java.util.Map Map提供了一种映射关系,其中的元素是以键值对(key-v ...

  2. leaflet地图框架

    leaflet 中文API LeafLet js 官网:http://leafletjs.com/index.html LeafLet js 官网demo: http://leafletjs.com/ ...

  3. 找到树中指定id的所有父节点

    const data = [{ id: 1, children: [{ id: 2, children: [{ id: 3, }, { id: 4, }], }], }, { id: 5, child ...

  4. 安装adbyby

    搞得那么麻烦干什么,助人就要直接点嘛请用 Xshell 连接你的路由 1.安装curlopkg update && opkg install curl 2.创建相关文件夹(如已经安装a ...

  5. docker 监控之 cadvisor

    我们可以使用多种方法监控容器的运行情况,比如EFK等,但是我们仍旧需要一个资源利用率监控系统.这个时候,google开发的cadvisor就可以帮上我们的忙了. cadvisor是google创建的用 ...

  6. 微信小程序设置全局请求URL 封装wx.request请求

    app.js: App({ //设置全局请求URL globalData:{ URL: 'https://www.oyhdo.com', }, /** * 封装wx.request请求 * metho ...

  7. 常忘知识点三-使用选择器继承来精简CSS --- @extend

    推荐一个很详细的sass教程:https://www.sass.hk/docs/ 在设计网页的时候常常遇到这种情况:一个元素使用的样式与另一个元素完全相同,但又添加了额外的样式.通常会在 HTML 中 ...

  8. javaweb--Rest访问(RestTemplate)

    Rest访问(RestTemplate)在实际的项目中,往往需要发送一个Get/Post请求到其他的系统(Rest API),比如向人员管理部门请求,然后解析返回信息获取该用户的基本信息等.JDK传统 ...

  9. ISO/IEC 9899:2011 条款6.4——词法元素

    6.4 词法元素 1.token(标记): keyword(关键字) identifier(标识符) constant(常量) string-literal(字符串字面量) punctuator(标点 ...

  10. Jmeter全局变量设置

    背景:因为BeanShell PreProcessor制造的参数是一些随机参数,每个HTTP取样器包括其他取样器拿值得时候都是单独重新取一次,所以如果当几个取样器的值都要拿同一值时,就不满足需求了,我 ...