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

Fra*_*zzo 2 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>   
Run Code Online (Sandbox Code Playgroud)

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

rek*_*eru 8

要在列表中正确显示活动的名称,您应该覆盖您的getView方法ListAdapter,并将一些局部变量设置为final(使用内部类):

@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);
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以使用自定义ArrayAdapter实现,该实现在应用程序中显示applicationinfo的正确标签TextView.

如果您创建一个新的ArrayList<String>,您也可以实现这一点,并在您记录应用程序的for循环内填充它:

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);
Run Code Online (Sandbox Code Playgroud)

然后你使用这个新的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;
}
Run Code Online (Sandbox Code Playgroud)

并且您的res/layout/list_item.xml布局文件必须包含和:text TextViewimage ImageView

<?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>   
Run Code Online (Sandbox Code Playgroud)