如何使用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
相关产品推荐
相关产品推荐

