• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android项目:手机安全卫士(16)—— 复杂 ListView浅析

Android项目:手机安全卫士(16)—— 复杂 ListView浅析

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了android手机安全卫士,安卓项目手机安全卫士,手机安全卫士项目,手机安全卫士项目描述,手机360安全卫士等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android项目:手机安全卫士(16)—— 复杂 ListView浅析


Android项目:手机安全卫士(16)—— 复杂 ListView

1 介绍

接着昨天的内容,今天继续完善应用列表,首先,应用分为系统应用和用户应用,安装位置分为手机内存和 sdcard,所以,我们在 ListView 中添加一个分类,分为系统应用和用户应用,每一个 item 显示安装的位置,最终效果如下所示:

ListView标题栏悬浮

2 判断应用类型和安装位置

ApplicationInfo 对象有个 flags 属性,它有很多个状态值,我们用它和 FLAG_EXTERNAL_STORAGE、FLAG_SYSTEM 进行与操作,从而判断是否具有该状态值,代码如下:


    int flag = applicationInfo.flags;
    if((flag&ApplicationInfo.FLAG_EXTERNAL_STORAGE)==ApplicationInfo.FLAG_EXTERNAL_STORAGE){
        //安装在sdcard中
        appInfo.isSdcardApp = true;
    }else {
        //安装在手机内存
        appInfo.isSdcardApp = false;
    }

    if((flag & ApplicationInfo.FLAG_SYSTEM)==ApplicationInfo.FLAG_SYSTEM){
        //系统应用
        appInfo.isUserApp = false;
    }else {
        //用户应用
        appInfo.isUserApp = true;
    }

然后在 AppManagerAdapter 的 getView() 方法中进行判断并赋值,代码如下:


    if (appInfo.isSdcardApp) {
        holder.tvLocation.setText("外置存储器");
    } else {
        holder.tvLocation.setText("手机内存");
    }

3 ListView 添加两种布局

接下来的就是今天的重点了,给 ListView 添加第二种 item 布局,将应用分为两类:系统应用和用户应用,并且用两个列表来存储,代码如下:


    ArrayList installedApp = getInstalledApp();
    ArrayList userList = new ArrayList();
    ArrayList systemList = new ArrayList();
    //拆分成两个列表
    for (AppInfo info : installedApp) {
        if (info.isUserApp) {
            userList.add(info);
        } else {
            systemList.add(info);
        }
    }

给 ListView 添加两种及以上布局,需要重写 Adapter 的两个方法:getViewTypeCount()、getItemViewType(),分别返回布局类型的数量,以及当前 item 的类型,对 AppManagerAdapter 的代码修改如下:


    /**
     * 应用列表适配器
     *
     * Created by XWdoor on 2016/3/22 022 11:44.
     * 博客:http://blog.csdn.net/xwdoor
     */
    public class AppManagerAdapter extends BaseAdapter {
        private final ArrayList mUserList;
        private final ArrayList mSystemList;
        private final Context mContext;

        public AppManagerAdapter(Context ctx, ArrayList userList, ArrayList systemList) {
            this.mContext = ctx;
            this.mUserList = userList;
            this.mSystemList = systemList;
        }

        @Override
        public int getCount() {
            return mUserList.size() + mSystemList.size() + 2;//增加两个标题栏
        }

        @Override
        public AppInfo getItem(int position) {
            // 遇到标题栏,直接返回null
            if (position == 0 || position == mUserList.size() + 1) {
                return null;
            }

            if (position < mUserList.size() + 1) {
                return mUserList.get(position - 1);//去掉标题栏的占位
            } else {
                return mSystemList.get(position - mUserList.size() - 2);//需要减掉两个标题栏的占位
            }
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        // 返回布局类型的个数, 就会缓存两种convertView
        @Override
        public int getViewTypeCount() {
            return 2;
        }

        // 根据当前位置,返回相应布局类型, 必须从0开始计算
        @Override
        public int getItemViewType(int position) {
            if (position == 0 || position == mUserList.size() + 1) {// 遇到标题栏
                return 0;
            } else {
                return 1;
            }
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // 首先要判断当前布局类型, 系统会缓存多种convertView, 然后根据当前布局类型,返回对应的convertView
            // 根据类型,加载不同布局
            switch (getItemViewType(position)){
                case 0://标题
                    HeaderHolder headerHolder = null;
                    if(convertView==null){
                        convertView = View.inflate(mContext,R.layout.item_app_manager_header,null);
                        headerHolder = new HeaderHolder();
                        headerHolder.tvHeader = (TextView) convertView.findViewById(R.id.tv_header);

                        convertView.setTag(headerHolder);
                    }else {
                        headerHolder = (HeaderHolder) convertView.getTag();
                    }

                    if(position == 0){
                        headerHolder.tvHeader.setText("用户应用(" + mUserList.size() + ")");
                    }else {
                        headerHolder.tvHeader.setText("系统应用(" + mSystemList.size() + ")");
                    }
                    break;
                case 1://应用item
                    ViewHolder holder = null;
                    if (convertView == null) {
                        convertView = View.inflate(mContext, R.layout.item_app_manager_adapter, null);
                        holder = new ViewHolder();
                        holder.tvName = (TextView) convertView.findViewById(R.id.tv_name);
                        holder.tvLocation = (TextView) convertView.findViewById(R.id.tv_location);
                        holder.ivIcon = (ImageView) convertView.findViewById(R.id.iv_icon);
                        convertView.setTag(holder);
                    } else {
                        holder = (ViewHolder) convertView.getTag();
                    }
                    AppInfo appInfo = getItem(position);
                    holder.tvName.setText(appInfo.appName);
                    holder.ivIcon.setImageDrawable(appInfo.icon);
                    if (appInfo.isSdcardApp) {
                        holder.tvLocation.setText("外置存储器");
                    } else {
                        holder.tvLocation.setText("手机内存");
                    }
                    break;
            }

            return convertView;
        }

        static class ViewHolder {
            public TextView tvName;
            public ImageView ivIcon;
            public TextView tvLocation;
        }

        static class HeaderHolder{
            public TextView tvHeader;
        }
    }

首先是构造函数需要传入两个应用列表,getCount() 方法需要返回两个列表总数再加上两个标题栏;getItem() 方法根据情况返回,若是标题栏,则返回 null,若是具体的某个 item,需要去掉标题栏的占位;同理,在 getView() 方法中,需要根据不同的类型,加载不同的布局,这里需要说一下关于 View 的复用问题,根据 getViewTypeCount() 方法的返回值,系统会保存多种 convertView, 然后根据当前布局类型,返回对应的 convertView。最好的效果如图:

复杂ListView-标题栏

4 ListView 标题栏悬浮

每当标题栏滑动到顶端时,都会有一个悬浮效果,表示以下 item 都是属于该标题类型,其实这只是一种障眼法,那个标题栏一直都在,只是在适当的时候修改它的显示文字即可,需要修改 AppManagerActivity 的布局文件,将 ListView 放在一个 FrameLayout 布局中,然后添加一个 TextView 覆盖在上面,同时增加一个加载数据提示进度条,代码如下:


    <framelayout android:layout_height="match_parent" android:layout_width="match_p



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android 手机卫士17--缓存清理,android17--
  • Android 手机卫士13--进程设置,android13--
  • Android 手机卫士10--应用管理器,android10--
  • Android 手机卫士8--删除通话记录,android8--
  • Android 手机卫士--导航界面4的业务逻辑,android卫士
  • Android 手机卫士--平移动画实现,android卫士
  • Android 手机卫士--获取联系人信息并显示与回显,android回显
  • Android 手机卫士--参照文档编写选择器,android选择器
  • Android 手机卫士--导航界面2,android卫士
  • Android 手机卫士--设置界面&amp;功能列表界面跳转逻辑处理,android卫士--界面

相关文章

  • 2017-05-26Kotlin中功能操作与集合(KAD 11),
  • 2017-05-26Handler消息传递机制(二)Handler,Loop,Message,MessageQueue的工作原理
  • 2017-05-26Activity---Activity之间数据交流,activity之间传递数据
  • 2017-05-26Android实现按钮点击效果(第一次点击变色,第二次恢复),android按钮
  • 2017-05-26设计模式学习心得,设计模式
  • 2017-05-26Android Studio之代码提示快捷键冲突设置,androidstudio
  • 2017-05-227.1.1 Android网络编程要学的东西与Http协议学习
  • 2017-05-26Android 事件分发
  • 2017-05-26ScrollView中嵌套GridView,ListView只显示一行的解决办法,scrollviewgridview
  • 2018-01-28android Listview的自定义界面的使用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 【Android】第7章(2)--布局控件常用的公共属性,android第7章
    • Android手机输入法按键监听-dispatchKeyEvent
    • 自定义控件详解(一):Paint类与Canvas类,paintcanvas
    • 硅谷社交2--欢迎页面,硅谷社交2--
    • 使用WakeLock使Android应用程序保持后台唤醒,wakelockandroid
    • [android] 手机卫士自定义控件的属性,android卫士
    • Android Couldn&#39;t load BaiduMapSDK,androidbaidumapsdk
    • Android代码优化小技巧,android代码小技巧
    • 我的android学习经历,android学习经历
    • OKHttp,okhttp使用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有