android spinner中的重复数据

android spinner中的重复数据,android,list,adapter,android-spinner,Android,List,Adapter,Android Spinner,我正在尝试使用除系统应用程序之外的所有已安装应用程序填充微调器。我遇到了两个问题: 1) 我得到了重复的数据 2) 当填充我的微调器并打开微调器项目列表时,应用程序名称之间有时会出现间隙 请参见下面的我的适配器代码: public class PackageAdapter extends BaseAdapter implements SpinnerAdapter { private List<ApplicationInfo> applications; private Contex

我正在尝试使用除系统应用程序之外的所有已安装应用程序填充微调器。我遇到了两个问题:

1) 我得到了重复的数据

2) 当填充我的微调器并打开微调器项目列表时,应用程序名称之间有时会出现间隙

请参见下面的我的适配器代码:

public class PackageAdapter extends BaseAdapter implements SpinnerAdapter {

private List<ApplicationInfo> applications;
private Context context;
private PackageManager packageManager = null;

public PackageAdapter(Context context) {
    this.context = context;

    // setting up the List applications with all the list of installed apps
    applications = new ArrayList<ApplicationInfo>();
    try {
        packageManager = context.getPackageManager();
        if (packageManager != null) {
            applications = packageManager.getInstalledApplications(0);
        }
    } catch (Exception e) {
        Log.e("error", e.getMessage());
    }

}

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

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

@Override
public long getItemId(int position) {
    return applications.indexOf(getItem(position));
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View spinView;
    if (convertView == null) {
        // setting up the view
        LayoutInflater inflater = (LayoutInflater)
                context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        spinView = inflater.inflate(R.layout.spin_layout, null);
    } else {
        spinView = convertView;
    }

    // getting one application from the list of apps.
    final ApplicationInfo application = this.applications.get(position);

    // filtering out the system apps and getting the application name
    String appName = "";
    if (packageManager.getLaunchIntentForPackage(application.packageName) != null) {
        appName = packageManager.getApplicationLabel(application).toString();
    }
    TextView t1 = (TextView) spinView.findViewById(R.id.field1);

    if (!appName.equals("")) {
        t1.setText(appName);
    }

    return spinView;
   }
}
公共类PackageAdapter扩展BaseAdapter实现SpinnerAdapter{
私人名单申请;
私人语境;
私有PackageManager PackageManager=null;
公共包适配器(上下文){
this.context=上下文;
//设置包含所有已安装应用程序列表的列表应用程序
applications=new ArrayList();
试一试{
packageManager=context.getPackageManager();
if(packageManager!=null){
applications=packageManager.getInstalledApplications(0);
}
}捕获(例外e){
Log.e(“error”,e.getMessage());
}
}
@凌驾
public int getCount(){
返回应用程序。size();
}
@凌驾
公共对象getItem(int位置){
返回应用程序。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回应用程序。indexOf(getItem(position));
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图自旋视图;
if(convertView==null){
//设置视图
LayoutInflater充气机=(LayoutInflater)
context.getSystemService(Activity.LAYOUT\u INFLATER\u SERVICE);
spinView=充气机。充气(R.layout.spin_layout,null);
}否则{
spinView=convertView;
}
//正在从应用程序列表中获取一个应用程序。
final ApplicationInfo application=this.applications.get(位置);
//筛选出系统应用程序并获取应用程序名称
字符串appName=“”;
if(packageManager.getLaunchIntentForPackage(application.packageName)!=null){
appName=packageManager.getApplicationLabel(application.toString();
}
TextView t1=(TextView)spinView.findViewById(R.id.field1);
如果(!appName.equals(“”){
t1.setText(appName);
}
返回自旋视图;
}
}

如果您对以上两项有任何帮助,我们将不胜感激!TY

检查此代码,我已经生成并测试了以下代码,您也可以将代码替换为此代码

这将为您提供已安装的软件包,设备中所有应用程序的源目录将在微调器中显示所有软件包

public class PackageAdapter extends BaseAdapter implements SpinnerAdapter {

private List<String> applications = new ArrayList<>();
private Context context;
private String TAG = "PackageAdapter";
PackageManager pm;

public PackageAdapter(Context context) {
    this.context = context;

    pm = context.getPackageManager();
    // setting up the List applications with all the list of installed apps
    List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

    for (ApplicationInfo packageInfo : packages) {

        if(!isSystemPackage(packageInfo)){
            Log.i(TAG, "Installed package :" + packageInfo.packageName);
            Log.i(TAG, "Source dir : " + packageInfo.sourceDir);
            applications.add(packageInfo.packageName);
        }
    }

}

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

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

@Override
public long getItemId(int position) {
    return applications.indexOf(getItem(position));
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View spinView;
    if (convertView == null) {
        // setting up the view
        LayoutInflater inflater = (LayoutInflater)
                context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        spinView = inflater.inflate(R.layout.spin_layout, null);
    } else {
        spinView = convertView;
    }

    TextView t1 = (TextView) spinView.findViewById(R.id.field1);

    String packageNames = applications.get(position);
    if (packageNames != null && !packageNames.equalsIgnoreCase("")) {

        String appName = "";
        try {
            appName = (String) pm.getApplicationLabel(pm.getApplicationInfo(applications.get(position), PackageManager.GET_META_DATA));
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        t1.setText(appName);
    }

    return spinView;
}


private boolean isSystemPackage(ApplicationInfo applicationInfo) {
    return ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
  }

}
公共类PackageAdapter扩展BaseAdapter实现SpinnerAdapter{
私有列表应用程序=新的ArrayList();
私人语境;
私有字符串TAG=“PackageAdapter”;
包装经理;
公共包适配器(上下文){
this.context=上下文;
pm=context.getPackageManager();
//设置包含所有已安装应用程序列表的列表应用程序
List packages=pm.getinstalledApplication(PackageManager.GET_元数据);
对于(ApplicationInfo packageInfo:packages){
如果(!isSystemPackage(packageInfo)){
Log.i(标签,“已安装的软件包:”+packageInfo.packageName);
Log.i(标签,“源目录:”+packageInfo.sourceDir);
add(packageInfo.packageName);
}
}
}
@凌驾
public int getCount(){
返回应用程序。size();
}
@凌驾
公共对象getItem(int位置){
返回应用程序。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回应用程序。indexOf(getItem(position));
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图自旋视图;
if(convertView==null){
//设置视图
LayoutInflater充气机=(LayoutInflater)
context.getSystemService(Activity.LAYOUT\u INFLATER\u SERVICE);
spinView=充气机。充气(R.layout.spin_layout,null);
}否则{
spinView=convertView;
}
TextView t1=(TextView)spinView.findViewById(R.id.field1);
字符串packageNames=applications.get(位置);
if(packageNames!=null&!packageNames.equalsIgnoreCase(“”){
字符串appName=“”;
试一试{
appName=(字符串)pm.getApplicationLabel(pm.getApplicationInfo(applications.get(position),PackageManager.get_META_DATA));
}捕获(PackageManager.NameNotFounde异常){
e、 printStackTrace();
}
t1.setText(appName);
}
返回自旋视图;
}
私有布尔isSystemPackage(ApplicationInfo ApplicationInfo){
返回((applicationInfo.flags和applicationInfo.FLAG_系统)!=0);
}
}

检查此代码,我已经生成并测试了以下代码,您也可以将代码替换为此代码

这将为您提供已安装的软件包,设备中所有应用程序的源目录将在微调器中显示所有软件包

public class PackageAdapter extends BaseAdapter implements SpinnerAdapter {

private List<String> applications = new ArrayList<>();
private Context context;
private String TAG = "PackageAdapter";
PackageManager pm;

public PackageAdapter(Context context) {
    this.context = context;

    pm = context.getPackageManager();
    // setting up the List applications with all the list of installed apps
    List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);

    for (ApplicationInfo packageInfo : packages) {

        if(!isSystemPackage(packageInfo)){
            Log.i(TAG, "Installed package :" + packageInfo.packageName);
            Log.i(TAG, "Source dir : " + packageInfo.sourceDir);
            applications.add(packageInfo.packageName);
        }
    }

}

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

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

@Override
public long getItemId(int position) {
    return applications.indexOf(getItem(position));
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    View spinView;
    if (convertView == null) {
        // setting up the view
        LayoutInflater inflater = (LayoutInflater)
                context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        spinView = inflater.inflate(R.layout.spin_layout, null);
    } else {
        spinView = convertView;
    }

    TextView t1 = (TextView) spinView.findViewById(R.id.field1);

    String packageNames = applications.get(position);
    if (packageNames != null && !packageNames.equalsIgnoreCase("")) {

        String appName = "";
        try {
            appName = (String) pm.getApplicationLabel(pm.getApplicationInfo(applications.get(position), PackageManager.GET_META_DATA));
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        t1.setText(appName);
    }

    return spinView;
}


private boolean isSystemPackage(ApplicationInfo applicationInfo) {
    return ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
  }

}
公共类PackageAdapter扩展BaseAdapter实现SpinnerAdapter{
私有列表应用程序=新的ArrayList();
私人语境;
私有字符串TAG=“PackageAdapter”;
包装经理;
公共包适配器(上下文){
this.context=上下文;
pm=context.getPackageManager();
//设置包含所有已安装应用程序列表的列表应用程序
List packages=pm.getinstalledApplication(PackageManager.GET_元数据);
对于(ApplicationInfo packageInfo:packages){
如果(!isSystemPackage(packageInfo)){
Log.i(标签,“已安装的软件包:”+packageInfo.packageName);
Log.i(标签,“源目录:”+packageInfo.sourceDir);
add(packageInfo.packageName);
}
}
}
@凌驾
public int getCount(){
返回应用程序。size();
}
@凌驾
公共对象getItem(int位置){
返回应用程序。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回应用程序。indexOf(getItem(position));
}
@凌驾
公共视图获取视图(int po)