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



原创粉丝点击