利用Listview实现程序列表展示

利用Listview实现程序列表展示

先来看一下效果图
效果图

这个Demo其实也没有什么难度,主要的难点就是在那两个title上,下来我就带大家看看去怎么实现这个效果

  1. 首先获取系统中安装的应用信息

    /**
     * 获取应用程序信息
     */
    
    public class AppInfoTools {
        public static List<AppInfo> getAppInfo(Context context) {
            List<AppInfo> list = new ArrayList<>();
            //获取PackageManager
            PackageManager pm = context.getPackageManager();
            //这里的0指的是要获取程序的基本信息
            List<PackageInfo> packageInfos = pm.getInstalledPackages(0);
            for (PackageInfo packageInfo : packageInfos) {
                //包名
                String packageName = packageInfo.packageName;
                //applica
                ApplicationInfo applicationInfo = packageInfo.applicationInfo;
                //应用名称 Label
                String name = applicationInfo.loadLabel(pm).toString();
                //图标
                Drawable drawable = applicationInfo.loadIcon(pm);
                //占用空间大小
                long size = new File(applicationInfo.sourceDir).length();
                //程序标记
                boolean isSystem = false;
                boolean isSD = false;
                //判断是用户还是系统程序
                int flags = applicationInfo.flags;
                //系统程序
                if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                    isSystem = true;
                } else {
                    isSystem = false;
                }
                //是否在SD中
                if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
                    isSD = true;
                } else {
                    isSD = false;
                }
                list.add(new AppInfo(packageName, name, drawable, size, isSystem, isSD));
            }
            return list;
        }
    }
    
  2. 声明listview并给其设置adapter

    layout
         <ListView
        android:id="@+id/lv_softwarem"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>
    
        //在这声明个默认的title
        <TextView
            android:id="@+id/tv_softwarem_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@android:color/holo_blue_bright"
            android:padding="8dp"
            android:text="用户程序(0)"
            android:textSize="18sp"
            />
    
    Activity
        public class MainActivity extends AppCompatActivity {
            //用户程序集合
            private List<AppInfo> userApp = new ArrayList<>();
            //系统程序集合
            private List<AppInfo> systemApp = new ArrayList<>();
            private SoftWareAdapter myAdapter;
            private TextView tv_title;
            private ListView lv;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                initView();
            }
    
            private void initView() {
                tv_title = (TextView) findViewById(R.id.tv_softwarem_title);
                lv = (ListView) findViewById(R.id.lv_softwarem);
                initData();
            }
    
            private void initData() {
                //当手机上APP很多时,这就是个耗时操作,所以需要放在子线程中
                new Thread() {
                    @Override
                    public void run() {
                        final List<AppInfo> appInfos = AppInfoTools.getAppInfo(MainActivity.this);
                        for (AppInfo appInfo : appInfos) {
                            //判断应用程序信息,将应用程序存放到不同的集合中
                            if (appInfo.isSystem) {
                                systemApp.add(appInfo);
                            } else {
                                userApp.add(appInfo);
                            }
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                //给默认title设置text
                                tv_title.setText("用户程序(" + userApp.size() + ")");
                                //设置adapter
                                myAdapter = new SoftWareAdapter(MainActivity.this, systemApp, userApp);
                                lv.setAdapter(myAdapter);
                            }
                        });
                    }
                }.start();
                //设置滑动监听
                lv.setOnScrollListener(new AbsListView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(AbsListView view, int scrollState) {
    
                    }
                     /**
                     * 滚动时回调的方法
                     * @param view
                     * @param firstVisibleItem 当前区域内可视的第一个item
                     * @param visibleItemCount 当前区域内可视的item总数
                     * @param totalItemCount item总数
                     */
                    @Override
                    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                        if (userApp != null && systemApp != null) {
                            if (firstVisibleItem >= userApp.size() + 1) {
                                tv_title.setText("系统程序(" + systemApp.size() + ")");
                            } else {
                                tv_title.setText("用户程序(" + userApp.size() + ")");
                            }
                        }
                    }
                });
            }
        }
    
  3. 接下来就是我们的重头戏了,创建adapter

    public class SoftWareAdapter extends BaseAdapter {
        private List<AppInfo> userApp ;
        private List<AppInfo> systemApp;
        private Context context;
    
        public SoftWareAdapter(Context context, List<AppInfo> systemApp, List<AppInfo> userApp) {
            this.context = context;
            this.systemApp = systemApp;
            this.userApp = userApp;
        }
    
        @Override
        public int getCount() {
            return userApp.size() + systemApp.size() + 2;
        }
    
        @Override
        public Object getItem(int position) {
            return null;
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        //拿到指定position的条目类型
        @Override
        public int getItemViewType(int position) {
            //标题布局类型
            if (position == 0 || position == userApp.size() + 1) {
                return 0;
            }
            //条目布局
            return 1;
        }
    
        //设置条目类型个数
        @Override
        public int getViewTypeCount() {
            return 2;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //调用getItemViewType方法,根据条目的显示的样式类型,设置条目显示相应的样式
            if (getItemViewType(position) == 0) {
                TextView textView = new TextView(context);
                textView.setTextSize(18);
                textView.setPadding(8, 8, 8, 8);
                textView.setBackgroundColor(Color.BLUE);
                //标题布局类型
                if (position == 0) {
                    textView.setText("用户程序(" + userApp.size() + ")");
                } else {
                    textView.setText("系统程序(" + systemApp.size() + ")");
                }
                return textView;
            } else {
                if (convertView == null) {
                    convertView = View.inflate(context, R.layout.item_software, null);
                    convertView.setTag(new ViewHolder(convertView));
                }
                ViewHolder viewHolder = (ViewHolder) convertView.getTag();
                //判断当前位置
                AppInfo info;
                if (position <= userApp.size()) {
                    info = userApp.get(position - 1);
                } else {
                    info = systemApp.get(position - userApp.size() - 2);
                }
                viewHolder.icon.setImageDrawable(info.icon);
                viewHolder.name.setText(info.name);
                viewHolder.size.setText(android.text.format.Formatter.formatFileSize(context, info.size));
                viewHolder.isSystem.setText(info.isSD ? "SD" : "手机内存");
                return convertView;
            }
        }
    
        static class ViewHolder {
            public TextView name;
            public TextView isSystem;
            public TextView size;
            public ImageView icon;
    
            public ViewHolder(View item) {
                this.name = (TextView) item.findViewById(R.id.tv_item_software_name);
                this.icon = (ImageView) item.findViewById(R.id.iv_item_software);
                this.size = (TextView) item.findViewById(R.id.tv_item_software_size);
                this.isSystem = (TextView) item.findViewById(R.id.tv_item_software_issystem);
            }
        }
    }
    

这个Demo很简单,相信大家看代码就很容易看懂的,好了今天就写到这了,

代码下载地址:https://github.com/creativityingenuity/listview_prac

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值