125.第三方应用和系统应用在ListView滚动的时候悬浮显示

来源:互联网 发布:产品设计学什么软件 编辑:程序博客网 时间:2024/06/05 23:39

悬浮显示需要监听ListView,滚动的时候获取到最上面一条的条数,根据这个数据来判断什么时候显示特殊内容,同时布局中使用FrameLayout来实现悬浮显示

activity_app_manager.xml主布局文件,通过FreameLayout实现悬浮的显示

<?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 style="@style/TitleStyle"    android:text="软件管理"        />    <LinearLayout         android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal"        >        <TextView             android:id="@+id/tv_rom"            android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="内存可用"    android:textSize="20sp"    android:textColor="@color/black"    android:layout_weight="1"            /><TextView     android:id="@+id/tv_sd"            android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="内存可用"    android:textSize="20sp"    android:textColor="@color/black"    android:layout_weight="1"            />           </LinearLayout>    <FrameLayout         android:layout_width="match_parent"    android:layout_height="match_parent"        ><include     android:id="@+id/list_view_callsafe"    layout="@layout/list_view_callsafe"    /><TextView     android:id="@+id/tv_app"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:textColor="@color/black"    android:background="#ff888888"    android:text="第三方软件"    /></FrameLayout></LinearLayout>



条目单个显示的布局文件item_app_manager.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="horizontal" >        <ImageView         android:id="@+id/iv_icon"        android:layout_width="50dp"    android:layout_height="50dp"    android:background="@drawable/ic_launcher"        />    <LinearLayout         android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_marginLeft="5dp"    android:orientation="vertical"        >        <TextView             android:id="@+id/tv_name"            android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:textSize="20sp"    android:textColor="@color/black"    android:singleLine="true"    android:text="手机卫视"            />        <TextView             android:id="@+id/tv_location"            android:layout_width="match_parent"    android:layout_height="wrap_content"    android:textSize="16sp"    android:layout_marginTop="2dp"    android:singleLine="true"    android:text="手机内存"            />         </LinearLayout>    <RelativeLayout         android:layout_width="wrap_content"   android:layout_height="wrap_content"        >   <TextView       android:id="@+id/tv_apksize"         android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:textSize="16sp"   android:layout_marginTop="10dp"   android:layout_marginRight="10dp"   android:singleLine="true"   android:text="112M"   android:layout_alignParentRight="true"            />            </RelativeLayout></LinearLayout>
AppInfo.javaapp细节的bean文件

package com.ldw.safe.bean;import android.graphics.drawable.Drawable;public class AppInfo {//图片的icon,Drawable比bitmap更广泛,后者只针对图,前者可以针对xmlprivate Drawable icon;private String apkName;private long apkSize;//app的大小private boolean userApp;//true表示用户app,false表示系统appprivate boolean isRom;//app放置的位置private String apkPackageName;//app的包名public Drawable getIcon() {return icon;}public void setIcon(Drawable icon) {this.icon = icon;}public String getApkName() {return apkName;}public void setApkName(String apkName) {this.apkName = apkName;}public long getApkSize() {return apkSize;}public void setApkSize(long apkSize) {this.apkSize = apkSize;}public boolean isUserApp() {return userApp;}public void setUserApp(boolean userApp) {this.userApp = userApp;}public boolean isRom() {return isRom;}public void setRom(boolean isRom) {this.isRom = isRom;}public String getApkPackageName() {return apkPackageName;}public void setApkPackageName(String apkPackageName) {this.apkPackageName = apkPackageName;}@Overridepublic String toString() {return "AppInfo [icon=" + icon + ", apkName=" + apkName + ", apkSize="+ apkSize + ", userApp=" + userApp + ", isRom=" + isRom+ ", apkPackageName=" + apkPackageName + "]";}}

AppInfos.java获取所以app信息的逻辑文件

package com.ldw.safe.engine;import java.io.File;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.content.pm.ApplicationInfo;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.graphics.drawable.Drawable;import com.ldw.safe.bean.AppInfo;/* * apps的基本信息 */public class AppInfos {//app的信息是多个,返回一个集合public static List<AppInfo> getAppInfos(Context context){ArrayList<AppInfo> packageAppInfos = new ArrayList<AppInfo>();//获取到包的管理者PackageManager packageManager = context.getPackageManager();//获取到所有的安装包List<PackageInfo> installedPackages= packageManager.getInstalledPackages(0);for(PackageInfo installedPackage : installedPackages){AppInfo appInfo = new AppInfo();//获取到应用程序的图标Drawable drawable = installedPackage.applicationInfo.loadIcon(packageManager);appInfo.setIcon(drawable);//获取到应用程序的名字String apkName = (String) installedPackage.applicationInfo.loadLabel(packageManager);appInfo.setApkName(apkName);//获取到应用程序的包名String apkPackageName = installedPackage.packageName;appInfo.setApkPackageName(apkPackageName);//获取到应用程序的路径String sourceDir = installedPackage.applicationInfo.sourceDir;//获取到应用程序的大小File file = new File(sourceDir);long apkSize = file.length();appInfo.setApkSize(apkSize);//第三方应用放在/data/app//系统应用放在/system/app//获取到安装程序的标记int flags = installedPackage.applicationInfo.flags;//和系统应用进行与运算if((flags & ApplicationInfo.FLAG_SYSTEM) != 0){//系统应用appInfo.setUserApp(false);}else{//第三方应用appInfo.setUserApp(true);}//判断位置if((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0){//sd卡appInfo.setRom(false);}else{//rom手机内存appInfo.setRom(true);}packageAppInfos.add(appInfo);//System.out.println("==============");//System.out.println("名字"+ apkName);//System.out.println("包名"+ apkPackageName);//System.out.println("大小"+ apkSize);}return packageAppInfos;}}

AppManagerActivity.java显示第三方和系统应用的app,包括2个特殊条目

package com.ldw.safe.Activity;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.text.format.Formatter;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import com.ldw.safe.R;import com.ldw.safe.bean.AppInfo;import com.ldw.safe.engine.AppInfos;import com.lidroid.xutils.ViewUtils;import com.lidroid.xutils.view.annotation.ViewInject;/* * 软件管理 */public class AppManagerActivity extends Activity {//不用findViewById的方法填充@ViewInject(R.id.list_view_callsafe)private ListView list_view_callsafe;@ViewInject(R.id.tv_rom)private TextView tv_rom;@ViewInject(R.id.tv_sd)private TextView tv_sd;private List<AppInfo> appInfos;//所有应用的集合private AppManagerAdapter adapter;private ArrayList<AppInfo> userAppInfos;//第三方应用的集合private ArrayList<AppInfo> systemAppInfos;//系统应用的集合@ViewInject(R.id.tv_app)private TextView tv_app;@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        initUi();        initData();}private class AppManagerAdapter extends BaseAdapter{@Overridepublic int getCount() {//多出2个特殊的条目return userAppInfos.size() + systemAppInfos.size() + 2;}@Overridepublic Object getItem(int position) {//获取到ListView中应该显示的正常的对象if(position == 0){return null;}else if(position == userAppInfos.size() + 1){return null;}AppInfo appInfo;if(position < userAppInfos.size() + 1){//中间添加了一个条目,需要减掉appInfo = userAppInfos.get(position - 1);}else{//多出了2个特殊条目int location = 1 + userAppInfos.size() + 1;appInfo = systemAppInfos.get(position - location);}return appInfo;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if(position == 0){//第三方应用程序的展示TextView textView = new TextView(AppManagerActivity.this);textView.setTextColor(Color.WHITE);textView.setBackgroundColor(Color.GRAY);textView.setText("第三方应用(" + userAppInfos.size() + ")");return textView;}else if(position == userAppInfos.size() + 1){//系统程序的展示TextView textView = new TextView(AppManagerActivity.this);textView.setTextColor(Color.WHITE);textView.setBackgroundColor(Color.GRAY);textView.setText("系统应用(" + systemAppInfos.size() + ")");return textView;}            AppInfo appInfo;            if (position < userAppInfos.size() + 1) {                //把多出来的特殊的条目减掉                appInfo = userAppInfos.get(position - 1);            } else {                int location = userAppInfos.size() + 2;                appInfo = systemAppInfos.get(position - location);            }View view = null;ViewHoler holder;//防止特殊条目的影响,特殊条目的LinearLayout是空的if(convertView != null && convertView instanceof LinearLayout){view = convertView;holder = (ViewHoler) convertView.getTag();}else{view = View.inflate(AppManagerActivity.this, R.layout.item_app_manager, null);holder = new ViewHoler();holder.iv_icon = (ImageView) view.findViewById(R.id.iv_icon);holder.tv_apksize = (TextView) view.findViewById(R.id.tv_apksize);holder.tv_location = (TextView) view.findViewById(R.id.tv_location);holder.tv_name = (TextView) view.findViewById(R.id.tv_name);view.setTag(holder);}//AppInfo appInfo = appInfos.get(position);holder.iv_icon.setBackground(appInfo.getIcon());holder.tv_apksize.setText(Formatter.formatShortFileSize(AppManagerActivity.this, appInfo.getApkSize()));holder.tv_name.setText(appInfo.getApkName());if(appInfo.isRom()){//手机内存holder.tv_location.setText("手机内存");}else{//sd卡holder.tv_location.setText("sd卡内存");}return view;}}static class ViewHoler{ImageView  iv_icon;TextView tv_apksize;TextView tv_location;TextView tv_name;}private Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg){adapter = new AppManagerAdapter();list_view_callsafe.setAdapter(adapter);}};/* * 初始化apk的数据 */private void initData() {//子线程中初始化,防止anrnew Thread(){@Overridepublic void run(){//获取到安装的所有的应用程序appInfos = AppInfos.getAppInfos(AppManagerActivity.this);//第三方应用的集合userAppInfos = new ArrayList<AppInfo>();//系统应用的集合systemAppInfos = new ArrayList<AppInfo>();for(AppInfo appInfo:appInfos){if(appInfo.isUserApp()){//第三方应用的集合添加数据userAppInfos.add(appInfo);}else{//系统应用集合添加数据systemAppInfos.add(appInfo);}}handler.sendEmptyMessage(0);}}.start();}//初始化界面private void initUi() {setContentView(R.layout.activity_app_manager);//View viewById = findViewById(R.id.list_view_callsafe);//不用findViewById的方法填充ViewUtils.inject(this);//获取到rom内存的剩余空间long rom_freeSpace = Environment.getDataDirectory().getFreeSpace();//获取到sd卡的剩余空间long sd_freeSpace = Environment.getExternalStorageDirectory().getFreeSpace();System.out.println("内存可用" + rom_freeSpace + "sd卡可用" + sd_freeSpace);//格式化存储卡的大小tv_rom.setText("内存可用" + Formatter.formatFileSize(this, rom_freeSpace));tv_sd.setText("sd卡可用" + Formatter.formatFileSize(this, sd_freeSpace));//list_view_callsafe的滚动事件监听list_view_callsafe.setOnScrollListener(new OnScrollListener(){@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}//firstVisibleItem 第一个可见的条的位置            //visibleItemCount 一页可以展示多少个条目            //totalItemCount   总共的item的个数@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {System.out.println("firstVisibleItem==" + firstVisibleItem + "visibleItemCount==" + visibleItemCount + " totalItemCount==" + totalItemCount);//popupWindowDismiss();//滚动的时候根据应用的不同展示不同的特殊条目                if (userAppInfos != null && systemAppInfos != null) {                    if (firstVisibleItem > (userAppInfos.size() + 1)) {                        //系统应用程序                        tv_app.setText("系统程序(" + systemAppInfos.size() + ")个");                    } else {                        //第三方应用程序                        tv_app.setText("第三方程序(" + userAppInfos.size() + ")个");                    }                }}});}}





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 过压保护灯亮怎么办 美的热水器接地异常怎么办 欠压保护器坏了怎么办 三孔插座没地线怎么办 二胡琴筒裂缝宽怎么办 有了月亮从四星宠满级的怎么办 党委下属没有党支部了党委怎么办 发生日期大于制单日期怎么办 美的空调出现p0怎么办 薯片受潮不脆了怎么办 泡过的莲子煮不烂怎么办 绿豆有煮不熟的怎么办 吃了羊肉吃西瓜怎么办 吃了狗肉和绿豆怎么办 做的衣柜没有门怎么办 蒸馒头熟了会瘪怎么办 3dmax贴图太大了怎么办 嘴皮边缘颜色深怎么办 嘴巴周围肤色暗沉怎么办 中奖彩票被洗了怎么办 牙龈下面长米粒肉疙瘩怎么办 书画印章盖反了怎么办 金龙鱼一个月不吃东西怎么办 罗汉鱼头撞扁了怎么办 房顶开槽埋线白色不一样怎么办 顶上灯挪位置线怎么办 马蜂窝弄掉又来怎么办 蜂窝弄掉又有怎么办 2018年小龙虾底板脏怎么办 一本分数线擦边过怎么办 玩具塑料球扁了怎么办 胶皮与海绵开了怎么办 安卓不支持flash了怎么办 看视频要加载flash怎么办 下水道管子铁皮破了怎么办 炸金花牌一样大怎么办 玩棋牌游戏输了怎么办 苹果7插耳机外放怎么办 出国种菠菜抓了怎么办 在菲做菠菜抓到怎么办 3串1中两个怎么办