package com.example.task16;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Task4Activity extends Fragment {
RecyclerView recyclerView;
List<AppInfo> appInfos;
PackageManager pm;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_task4,container,false);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
recyclerView =getView().findViewById(R.id.recyclerView4);
appInfos = queryFilter();
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(),1));
final GridView4Adapter gridView4Adapter = new GridView4Adapter(getActivity(),appInfos);
gridView4Adapter.setOnItemListener(new GridView4Adapter.OnItemClickListener() {
public boolean onLongClick(final int position) {
AlertDialog.Builder dialogBuidler=new AlertDialog.Builder(getActivity());
dialogBuidler.setMessage("确定删除这条信息么?");
dialogBuidler.setTitle("消息提示");
dialogBuidler.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
deleteData(position);
recyclerView.setAdapter(gridView4Adapter);
Toast.makeText(getActivity(), "删除成功", Toast.LENGTH_LONG).show();
}
});
dialogBuidler.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialogBuidler.create().show();
return true;
}
public void onClick(int position) {
doStartApplicationWithPackageName(appInfos.get(position).getPkgName());
}
});
recyclerView.setAdapter(gridView4Adapter);
}
private AppInfo getAppInfo(ApplicationInfo app) {
AppInfo appInfo =new AppInfo();
appInfo.setAppLabel((String) app.loadLabel(pm));
appInfo.setAppIcon(app.loadIcon(pm));
appInfo.setPkgName(app.packageName);
return appInfo;
}
private List<AppInfo> queryFilter() {
pm = getActivity().getPackageManager();
List<ApplicationInfo> list = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
Collections.sort(list, new ApplicationInfo.DisplayNameComparator(pm));
List<AppInfo> appInfos = new ArrayList<>();
appInfos.clear();
for (ApplicationInfo app:list){
appInfos.add(getAppInfo(app));
}
return appInfos;
}
private void doStartApplicationWithPackageName(String packageName){
//通过包名获取此App详细信息
PackageInfo packageInfo =null;
try {
packageInfo =getActivity().getPackageManager().getPackageInfo(packageName,0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if(packageInfo ==null){
return ;
}
//创建一个类别为CATRGORY_LAUNCHER的该包名的Intent
Intent resolveIntent =new Intent(Intent.ACTION_MAIN,null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setPackage(packageInfo.packageName);
//通过getPackageManager()的queryIntentActivitires方法去遍历
List<ResolveInfo> resolveInfos =getActivity().getPackageManager().queryIntentActivities(resolveIntent,0);
for(ResolveInfo resolveInfo:resolveInfos){
if(resolveInfo!=null){
String pkgName =resolveInfo.activityInfo.name;
String className =resolveInfo.activityInfo.name;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
//设置CompoentName
ComponentName cn =new ComponentName(packageName,className);
intent.setComponent(cn);
getActivity().startActivity(intent);
}
}
}
private void deleteData(int position){
List<AppInfo> newList =new ArrayList<AppInfo>();
appInfos.remove(position);
newList.addAll(appInfos);
appInfos.clear();
appInfos.addAll(newList);
}
}
package com.example.task16;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class GridView4Adapter extends RecyclerView.Adapter<MainMenuView4holder> {
Context context;
List<AppInfo> list;
private OnItemClickListener mOnItemClickListener;
public GridView4Adapter(Context context, List<AppInfo> list) {
this.context = context;
this.list = list;
}
public void setOnItemListener(OnItemClickListener mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickListener;
}
//定义一个监听接口,里面有两个方法
public interface OnItemClickListener{
void onClick(int position);
boolean onLongClick(int position);
}
@NonNull
@Override
public MainMenuView4holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MainMenuView4holder(LayoutInflater.from(context).inflate(R.layout.item4_food,null));
}
@Override
public void onBindViewHolder(@NonNull MainMenuView4holder holder, final int position) {
holder.imageView.setImageDrawable(list.get(position).getAppIcon());
holder.textView.setText(list.get(position).getAppLabel());
if (mOnItemClickListener!=null) {
//直接给某个空间添加监听
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onClick(position);
}
});
//直接给某个空间添加长按监听
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnItemClickListener.onLongClick(position);
return true;
}
});
}
}
@Override
public int getItemCount() {
return null!=list?list.size():0;
}
}
class MainMenuView4holder extends RecyclerView.ViewHolder {
public ImageView imageView;
public TextView textView;
public MainMenuView4holder(View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.appImage);
textView = itemView.findViewById(R.id.appName);
}
}
前端页面是
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context=".Task4Activity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView4" android:layout_width="match_parent" android:layout_height="wrap_content"> </androidx.recyclerview.widget.RecyclerView> </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Task4Activity"> <LinearLayout android:id="@+id/linearLayout" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/appImage" android:layout_width="40dp" android:layout_height="40dp" android:src="@mipmap/ic_launcher"/> <TextView android:id="@+id/appName" android:layout_gravity="center" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="计算机"/> </LinearLayout> <View android:layout_marginTop="2dp" android:layout_below="@+id/linearLayout" android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/colorPrimary"/> </RelativeLayout>
没有看明白的可以建个项目把这些复制进去,运行一下bebug一下就应该能看懂了