参考了https://blog.csdn.net/wuweiwei001/article/details/54602296
首先是文件组织结构
两个xml,activity_myfirst_activate.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#c610ef"
android:gravity="center"
android:padding="5dp"
android:text="所有应用"
android:textColor="#ffffff"
android:textSize="25sp" />
<ListView
android:id="@+id/lv_main"
android:layout_width="match_parent"
android:layout_height="fill_parent" >
</ListView>
</android.support.constraint.ConstraintLayout>
item_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/iv_item_icon"
android:layout_width="60dp"
android:layout_height="60dp"
/>
<TextView
android:id="@+id/tv_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/iv_item_icon"
android:layout_centerVertical="true"
android:text="应用名称"
android:layout_marginLeft="10dp"
android:textSize="20sp"/>
</RelativeLayout>
下面是MainActivity
package com.example.wzy.myapplication;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity implements AdapterView.OnItemLongClickListener {
private ListView lv_main;
private List<AppInfo> data;
private AppAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_myfirst_activate);
//初始化成员变量
lv_main = (ListView) findViewById(R.id.lv_main);
data = getAllAppInfos();
adapter = new AppAdapter();
//显示列表
lv_main.setAdapter(adapter);
//给ListView设置item的点击监听
lv_main.setOnItemClickListener(new AdapterView.OnItemClickListener() {
/**
* parent : ListView
* view : 当前行的item视图对象
* position : 当前行的下标
*/
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//提示当前行的应用名称
String appName = data.get(position).getAppName();
//提示
Toast.makeText(MainActivity.this, appName, Toast.LENGTH_SHORT).show();
}
});
//给LitView设置Item的长按监听
lv_main.setOnItemLongClickListener(this);
}
class AppAdapter extends BaseAdapter {
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return data.get(position);
}
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
//返回带数据当前行的Item视图对象
public View getView(int position, View convertView, ViewGroup parent) {
//1. 如果convertView是null, 加载item的布局文件
if(convertView==null) {
Log.e("TAG", "getView() load layout");
convertView = View.inflate(MainActivity.this, R.layout.item_main, null);
}
//2. 得到当前行数据对象
AppInfo appInfo = data.get(position);
//3. 得到当前行需要更新的子View对象
ImageView imageView = (ImageView) convertView.findViewById(R.id.iv_item_icon);
TextView textView = (TextView) convertView.findViewById(R.id.tv_item_name);
//4. 给视图设置数据
imageView.setImageDrawable(appInfo.getIcon());
textView.setText(appInfo.getAppName());
//返回convertView
return convertView;
}
}
/*
* 得到手机中所有应用信息的列表
* AppInfo
* Drawable icon 图片对象
* String appName
* String packageName
*/
protected List<AppInfo> getAllAppInfos() {
List<AppInfo> list = new ArrayList<AppInfo>();
// 得到应用的packgeManager
PackageManager packageManager = getPackageManager();
// 创建一个主界面的intent
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
// 得到包含应用信息的列表
List<ResolveInfo> ResolveInfos = packageManager.queryIntentActivities(
intent, 0);
// 遍历
for (ResolveInfo ri : ResolveInfos) {
// 得到包名
String packageName = ri.activityInfo.packageName;
// 得到图标
Drawable icon = ri.loadIcon(packageManager);
// 得到应用名称
String appName = ri.loadLabel(packageManager).toString();
// 封装应用信息对象
AppInfo appInfo = new AppInfo(icon, appName, packageName);
// 添加到list
list.add(appInfo);
}
return list;
}
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
//删除当前行
//删除当前行的数据
data.remove(position);
//更新列表
//lv_main.setAdapter(adapter);//显示列表, 不会使用缓存的item的视图对象
adapter.notifyDataSetChanged();//通知更新列表, 使用所有缓存的item的视图对象
return true;
}
}