You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用GridView展示所有已安装应用

实现GridView展示已安装应用的完整步骤

1. 修改主布局文件,添加GridView

在你现有的LinearLayout中,加入GridView组件用于承载应用列表:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:paddingStart="10dp"
    android:background="@drawable/background"
    android:paddingEnd="10dp">

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Installed Apps"
        android:textStyle="bold"
        android:textSize="18sp"
        android:paddingTop="18dp"
        android:paddingBottom="6dp"
        android:gravity="center"/>

    <!-- 新增GridView -->
    <GridView
        android:id="@+id/gridView_apps"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:numColumns="3" <!-- 每行显示3个应用,可按需调整 -->
        android:horizontalSpacing="8dp"
        android:verticalSpacing="8dp"
        android:padding="4dp"/>

</LinearLayout>

2. 创建GridView子项布局(item_app.xml)

在res/layout目录下创建单个应用的显示布局,用来展示应用图标和名称:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="4dp">

    <ImageView
        android:id="@+id/iv_app_icon"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:scaleType="fitCenter"/>

    <TextView
        android:id="@+id/tv_app_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="12sp"
        android:maxLines="1"
        android:ellipsize="end"
        android:layout_marginTop="4dp"/>

</LinearLayout>

3. 创建应用信息数据类

Kotlin版本

data class AppInfo(
    val appName: String,
    val packageName: String,
    val appIcon: Drawable
)

Java版本

public class AppInfo {
    private String appName;
    private String packageName;
    private Drawable appIcon;

    public AppInfo(String appName, String packageName, Drawable appIcon) {
        this.appName = appName;
        this.packageName = packageName;
        this.appIcon = appIcon;
    }

    public String getAppName() { return appName; }
    public String getPackageName() { return packageName; }
    public Drawable getAppIcon() { return appIcon; }
}

4. 编写自定义适配器

Kotlin版本

class AppAdapter(private val context: Context, private val appList: List<AppInfo>) : BaseAdapter() {

    override fun getCount(): Int = appList.size

    override fun getItem(position: Int): Any = appList[position]

    override fun getItemId(position: Int): Long = position.toLong()

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val view = convertView ?: LayoutInflater.from(context).inflate(R.layout.item_app, parent, false)
        val appInfo = appList[position]

        view.findViewById<ImageView>(R.id.iv_app_icon).setImageDrawable(appInfo.appIcon)
        view.findViewById<TextView>(R.id.tv_app_name).text = appInfo.appName

        return view
    }
}

Java版本

public class AppAdapter extends BaseAdapter {
    private Context context;
    private List<AppInfo> appList;

    public AppAdapter(Context context, List<AppInfo> appList) {
        this.context = context;
        this.appList = appList;
    }

    @Override
    public int getCount() {
        return appList.size();
    }

    @Override
    public Object getItem(int position) {
        return appList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = LayoutInflater.from(context).inflate(R.layout.item_app, parent, false);
        }

        AppInfo appInfo = appList.get(position);
        ImageView ivIcon = view.findViewById(R.id.iv_app_icon);
        TextView tvName = view.findViewById(R.id.tv_app_name);

        ivIcon.setImageDrawable(appInfo.getAppIcon());
        tvName.setText(appInfo.getAppName());

        return view;
    }
}

5. 在Activity中获取应用数据并绑定

Kotlin版本

class MainActivity : AppCompatActivity() {
    private lateinit var gridView: GridView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        gridView = findViewById(R.id.gridView_apps)
        val appList = getInstalledApps()
        gridView.adapter = AppAdapter(this, appList)

        // 可选:添加应用点击启动逻辑
        gridView.onItemClickListener = AdapterView.OnItemClickListener { _, _, position, _ ->
            val appInfo = appList[position]
            packageManager.getLaunchIntentForPackage(appInfo.packageName)?.let { startActivity(it) }
        }
    }

    private fun getInstalledApps(): List<AppInfo> {
        val appList = mutableListOf<AppInfo>()
        val packageManager = packageManager

        val packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA)
        for (packageInfo in packages) {
            try {
                val appName = packageManager.getApplicationLabel(packageInfo).toString()
                val appIcon = packageManager.getApplicationIcon(packageInfo)
                appList.add(AppInfo(appName, packageInfo.packageName, appIcon))
            } catch (e: PackageManager.NameNotFoundException) {
                e.printStackTrace()
            }
        }
        // 按应用名称排序
        appList.sortBy { it.appName }
        return appList
    }
}

Java版本

public class MainActivity extends AppCompatActivity {
    private GridView gridView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        gridView = findViewById(R.id.gridView_apps);
        List<AppInfo> appList = getInstalledApps();
        gridView.setAdapter(new AppAdapter(this, appList));

        // 可选:添加应用点击启动逻辑
        gridView.setOnItemClickListener((parent, view, position, id) -> {
            AppInfo appInfo = appList.get(position);
            Intent intent = getPackageManager().getLaunchIntentForPackage(appInfo.getPackageName());
            if (intent != null) startActivity(intent);
        });
    }

    private List<AppInfo> getInstalledApps() {
        List<AppInfo> appList = new ArrayList<>();
        PackageManager packageManager = getPackageManager();

        List<ApplicationInfo> packages = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
        for (ApplicationInfo packageInfo : packages) {
            try {
                String appName = packageManager.getApplicationLabel(packageInfo).toString();
                Drawable appIcon = packageManager.getApplicationIcon(packageInfo);
                appList.add(new AppInfo(appName, packageInfo.packageName, appIcon));
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
        }
        // 按应用名称排序
        Collections.sort(appList, (a1, a2) -> a1.getAppName().compareToIgnoreCase(a2.getAppName()));
        return appList;
    }
}

6. 添加必要权限(AndroidManifest.xml)

针对Android 11及以上版本,需要添加查询所有应用的权限:

<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />

Android 10及以下版本无需此权限,getInstalledApplications可直接获取所有应用。

内容的提问来源于stack exchange,提问作者Mr_Milky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:43:16