在Android系统中,使用PackageManager
类获取手机安装的应用信息,如:应用程序的图标、名称、包名等。将这些应用的程序的信息显示到界面的ListView
上,形成一个应用列表。如图:
AppInfo类
AppInfo
类用于封装获取到的每一个应用程序的信息。appName
表示应用程序的名称,packageName
表示应用程序的包名,appIcon
表示应用程序的图标。代码如下:
1 | package com.example.application_info; |
ListView子项的自定义布局
在layout目录下新建app_info_item.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" >
<ImageView
android:id="@+id/app_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="match_parent" >
<TextView
android:id="@+id/app_name_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名称: "
android:layout_marginLeft="10dip"/>
<TextView
android:id="@+id/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/app_name_label" />
<TextView
android:id="@+id/app_package_name_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/app_name_label"
android:text="包名: "
android:layout_marginLeft="10dip"/>
<TextView
android:id="@+id/app_package_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/app_name"
android:layout_toRightOf="@id/app_package_name_label" />
</RelativeLayout>
</LinearLayout>
在这个布局中,定义了一个用于显示应用图标的ImageView(id为app_icon),以及对应的应用名称(id为app_name)和包名的TextView(id为app_package_name)。
AppInfoAdapter类
创建一个自定义个的AppInfoAdapter
类,并将泛型指定为AppInfo
类。代码如下:
1 | package com.example.application_info; |
AppInfoAdapter
类重写了父类的一组构造函数,用于将上下文、ListView子项布局的id和数据都传递进来。另外又重写了getView()
方法,这个方法在每个子项被滚动到屏幕内的时候被调用。
ListView的优化:
在
getView()
方法中,首先通过getItem()
方法得到当前项的AppInfo
实例,如果convertView
为空,则使用LayoutInflater
去加载布局。如果不为空直接对convertView
进行重用。内部类
ViewHolder
用于对控件的实例进行缓存。当convertView
为空的时候,创建一个ViewHolder
对象,调用View
的findViewById()
方法分别获取到应用图标的ImageView、应用名称和包名的TextView 的实例,并将控件的实例都存放在ViewHolder
里,然后调用View的setTag()
方法,将ViewHolder
对象存储在View中。当convertView
不为空的时候则调用
View的getTag
()方法,把ViewHolder
重新取出。这样所有控件的实例都缓存在了ViewHolder
里,就没有必要每次都通过findViewById()
方法来获取控件实例了。最后分别调用ImageView的setImageResource()
和TextView的setText()
方法来设置显示的图片和文字。
activity_main.xml
在布局中加入ListView
控件,指定一个id为app_info_list_view。代码如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.application_info.MainActivity" >
<ListView
android:id="@+id/app_info_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</RelativeLayout>
MainActivity类
在onCreate()
方法中调用PackageManager
来获得手机上安装的所有应用程序的信息。对于每一个应用获取它的名称、包名、图标。并显示到相应的ListView
控件中。代码如下:
1 | package com.example.application_info; |