Android得到系统已安装应用程序包列表方法 自定义ListView显示 PackageManager的使用
来源:互联网 发布:mac如何给iphone充电 编辑:程序博客网 时间:2024/05/19 01:31
得到系统安装的程序包,可以通过PackageManager对象getInstalledPackages方法,该方法直接返回一个包含程序包信息PackageInfo的List。今天学习PackageManager的同时,顺便记一下ListView使用自定义适配器以及自定义视图的方法,前面写得不够详细。先看效果图:
每一项分成三部分,左边是应用图标,右边分上下两部分,上面是应用名,下面是包名。顺便说一下,ListView的自定义布局,定义的是一项的布局,然后根据项的数量叠加。
下面是这个布局的xml代码 piitem.xml:
123456789101112
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal" android:layout_width="fill_parent"android:layout_height="fill_parent"><ImageView android:id="@+id/icon" android:layout_width="48dip"android:layout_height="48dip" /><LinearLayout android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="wrap_content"><TextView android:id="@+id/appName" android:layout_width="fill_parent" android:layout_height="wrap_content"/><TextView android:id="@+id/packageName" android:layout_width="fill_parent" android:layout_height="wrap_content"/></LinearLayout></LinearLayout>
main.xml的布局就不贴了吧,就一个ListView,id为lv
写个自定义的适配器:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
package com.pocketdigi;import java.util.List;import java.util.Map; import android.content.Context;import android.graphics.drawable.Drawable;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.SimpleAdapter;import android.widget.TextView; public class Adapter extends SimpleAdapter {private int[] mTo; private String[] mFrom; private ViewBinder mViewBinder; private List<? extends Map<String, ?>> mData; private int mResource; private LayoutInflater mInflater;public Adapter(Context context,List<? extends Map<String, ?>> data, int resource, String[] from,int[] to) {super(context, data, resource, from, to);mData = data; mResource = resource; mFrom = from; mTo = to; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);} public View getView(int position, View convertView, ViewGroup parent) { return createViewFromResource(position, convertView, parent, mResource); } private View createViewFromResource(int position, View convertView, ViewGroup parent, int resource) { View v; if (convertView == null) { v = mInflater.inflate(resource, parent, false); final int[] to = mTo; final int count = to.length; final View[] holder = new View[count]; for (int i = 0; i < count; i++) { holder[i] = v.findViewById(to[i]); } v.setTag(holder); } else { v = convertView; } bindView(position, v); return v; } private void bindView(int position, View view) { final Map dataSet = mData.get(position); if (dataSet == null) { return; } final ViewBinder binder = mViewBinder; final View[] holder = (View[]) view.getTag(); final String[] from = mFrom; final int[] to = mTo; final int count = to.length; for (int i = 0; i < count; i++) { final View v = holder[i]; if (v != null) { final Object data = dataSet.get(from[i]); String text = data == null ? "" : data.toString(); if (text == null) { text = ""; } boolean bound = false; if (binder != null) { bound = binder.setViewValue(v, data, text); } if (!bound) { //自定义适配器,关键在这里,根据传过来的控件类型以及值的数据类型,执行相应的方法 //可以根据自己需要自行添加if语句。另CheckBox等继承自TextView的控件也会被识别成TextView, 这就需要判断值的类型了 if (v instanceof TextView) { //如果是TextView控件 setViewText((TextView) v, text); //调用SimpleAdapter自带的方法,设置文本 } else if (v instanceof ImageView) {//如果是ImageView控件 setViewImage((ImageView) v, (Drawable) data); //调用下面自己写的方法,设置图片 } else { throw new IllegalStateException(v.getClass().getName() + " is not a " + " view that can be bounds by this SimpleAdapter"); } } } } } public void setViewImage(ImageView v, Drawable value) { v.setImageDrawable(value); } };
关键部分已注释,如果用到其他控件,只要修改注释的地方增加判断就可以了。
下面是主程序代码 Main.java:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
package com.pocketdigi; import java.util.ArrayList;import java.util.HashMap;import java.util.List; import android.app.Activity;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.os.Bundle;import android.widget.ListView; public class Main extends Activity {/** Called when the activity is first created. */ListView lv;Adapter adapter;ArrayList<HashMap<String, Object>> items=new ArrayList<HashMap<String, Object>>(); @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);lv = (ListView) findViewById(R.id.lv);PackageManager pm= getPackageManager();//得到PackageManager对象List<PackageInfo> packs = pm.getInstalledPackages(0);//得到系统 安装的所有程序包的PackageInfo对象 for (PackageInfo pi : packs) {HashMap<String, Object> map = new HashMap<String, Object>();map.put("icon", pi.applicationInfo.loadIcon(pm));//图标map.put("appName", pi.applicationInfo.loadLabel(pm));//应用名map.put("packageName", pi.packageName);//包名items.add(map);//循环读取存到HashMap,再增加到ArrayList.一个HashMap就是一项} adapter = new Adapter(this, items, R.layout.piitem, new String[] {"icon", "appName", "packageName" }, new int[] { R.id.icon,R.id.appName, R.id.packageName });//参数:Context,ArrayList(item的集合),item的layout,包含ArrayList中Hashmap的key的数组,key所对应的值相对应的控件idlv.setAdapter(adapter); }}
摘自:http://www.pocketdigi.com/20110728/425.html
- Android得到系统已安装应用程序包列表方法 自定义ListView显示 PackageManager的使用
- Android自定义Dialog布局listview 实现显示安装的应用
- Android取得已安装的应用列表
- 通过PackageManager启动/卸载已安装的应用
- android获取已安装的应用程序包名和类名
- Android开发之listView使用(手机应用列表显示)
- PackageManager(管理应用程序包)
- Android Listview(列表显示)性能优化的相关专利方法及系统
- listview列表显示系统应用实例代码
- Android系统中的服务管理类(ActivityManager、PowerManager(电源管理)、AudioManager(音频管理)。PackageManager(管理应用程序包))
- 获取系统已安装应用列表
- 应用程序包的安装
- Android采用ListView实现列表数据的显示--Adapter应用
- android 卸载应用、打开应用、获得系统中已安装应用列表
- Android中使用ListView显示列表之SimpleAdapter的使用
- Android 获取应用系统程序的包名 PackageManager.
- Android---获取已安装应用列表
- 利用ListView来显示手机的系统应用,第三方应用,SD应用列表
- 颠倒栈
- Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE无法安装错误解决方案
- robots.txt文件基础知识
- 还有一年我就要毕业了!
- mkyaffs2image
- Android得到系统已安装应用程序包列表方法 自定义ListView显示 PackageManager的使用
- SPOT5多光谱数据模拟真彩色的三种方法
- android adb shell 命令大全
- android 多媒体和相机详解
- 获取view在屏幕中的位置
- 如何安装 Fltmgr.sys 驱动程序
- IE6不支持PNG透明问题
- md5加密 linux c/c++
- 这十月,与c++代码相伴的日子