显示所有已安装应用程序的ListView并实现OnItemClickListener的问题

时间:2011-05-13 16:46:42

标签: android

我正在尝试编写一个非常简单的应用程序,它在列表视图中显示设备上每个已安装应用程序的名称。我使用Google的ListView教程作为基础。

这是我的代码:

@Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        final PackageManager pm = this.getPackageManager();

        Intent intent = new Intent(Intent.ACTION_MAIN, null);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);

        final ArrayList<ResolveInfo> list =
                (ArrayList<ResolveInfo>) pm.queryIntentActivities(intent, 
                        PackageManager.PERMISSION_GRANTED);
        for (ResolveInfo rInfo : list)
        {
            Log.i(TAG, ": Installed Applications " + rInfo.activityInfo.
                    applicationInfo.loadLabel(pm).toString());
        }

        final ArrayAdapter<ResolveInfo> adapter = 
            new ArrayAdapter<ResolveInfo>(this, R.layout.list_item, list)
            {
            @Override
            public View getView(int position, View convertView, ViewGroup parent)
            {
                if (convertView == null)
                    convertView = LayoutInflater.from(parent.getContext()).
                        inflate(R.layout.list_item, parent, false);

                final String text = list.get(position).activityInfo.
                    applicationInfo.loadLabel(pm).toString();
                ((TextView)convertView.findViewById(R.id.text)).setText(text);

                final Drawable drawable = list.get(position).activityInfo.applicationInfo.loadIcon(pm);
                ((ImageView)convertView.findViewById(R.id.image)).setImageDrawable(drawable);

                return convertView;
            }

            };
        setListAdapter(adapter);

        ListView lv = getListView();
        lv.setTextFilterEnabled(true);
        lv.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

                // On Item Click Activity
                // This is where I want to send the Package Name of the app selected to be passed to a method.


            }
          });
    }




 <?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/image" 
        android:layout_width="50dp" android:layout_height="50dp" />
    <TextView android:id="@+id/text"
        android:layout_width="fill_parent" android:layout_height="wrap_content"
        android:padding="10dp" android:textSize="16sp" />
</LinearLayout>   

更新:我现在需要使用OnItemClickListener将所选应用程序的包名称传递给方法。

1 个答案:

答案 0 :(得分:8)

要在列表中正确显示活动的名称,您应该覆盖getView的{​​{1}}方法,并将一些局部变量设置为final(用于处理内部类):< / p>

ListAdapter

这样您就可以使用自定义@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final PackageManager pm = this.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.addCategory(Intent.CATEGORY_LAUNCHER); final ArrayList<ResolveInfo> list = (ArrayList<ResolveInfo>) pm.queryIntentActivities(intent, PackageManager.PERMISSION_GRANTED); for (ResolveInfo rInfo : list) { Log.i(TAG, ": Installed Applications " + rInfo.activityInfo. applicationInfo.loadLabel(pm).toString()); } final ArrayAdapter<ResolveInfo> adapter = new ArrayAdapter<ResolveInfo>(this, R.layout.list_item, list) { @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = super.getView(position, convertView, parent); final String text = list.get(position).activityInfo. applicationInfo.loadLabel(pm).toString(); ((TextView)convertView).setText(text); return convertView; } }; setListAdapter(adapter); ListView lv = getListView(); lv.setTextFilterEnabled(true); } 实现,该实现在ArrayAdapter中显示applicationinfo的正确标签。

如果你创建一个新的TextView,你也可以实现这一点,并在你记录应用程序的for循环中填充它:

ArrayList<String>

然后,您使用这个新的final ArrayList<String> labelList = new ArrayList<String>(); for (ResolveInfo rInfo : list) { Log.i(TAG, ": Installed Applications " + rInfo.activityInfo. applicationInfo.loadLabel(pm).toString()); labelList.add(rInfo.activityInfo. applicationInfo.loadLabel(pm).toString()); } final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, labelList); setListAdapter(adapter); 作为labelList的来源。

<强>更新
要将图标包含在项呈示器中,重写的adapter方法将如下所示:

getView

并且您的@Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) convertView = LayoutInflater.from(parent.getContext()). inflate(R.layout.list_item, parent, false); final String text = list.get(position).activityInfo. applicationInfo.loadLabel(pm).toString(); ((TextView)convertView.findViewById(R.id.text)).setText(text); final Drawable drawable = list.get(position).activityInfo.applicationInfo.loadIcon(pm); ((ImageView)convertView.findViewById(R.id.image)).setImageDrawable(drawable); return convertView; } 布局文件必须包含 res/layout/list_item.xml text TextView {{1 }}:

image
相关问题