Java 如何按字母顺序返回已安装应用的列表

Java 如何按字母顺序返回已安装应用的列表,java,android,listview,android-fragments,Java,Android,Listview,Android Fragments,在我的Android项目中,我试图在可滚动选项卡中的actionbaractivity中按字母顺序返回用户安装和系统应用程序的列表 我使用自定义适配器类来获取应用程序列表,并使用代码在listview中返回用户安装或预安装的应用程序。然而,我正在尝试按字母顺序返回它们 我正试图遵循这些,但没有运气 现在,我将此作为适配器类: package com.ibc.android.demo.appslist.app; import android.app.Activity; import androi

在我的Android项目中,我试图在可滚动选项卡中的actionbaractivity中按字母顺序返回用户安装和系统应用程序的列表

我使用自定义适配器类来获取应用程序列表,并使用代码在listview中返回用户安装或预安装的应用程序。然而,我正在尝试按字母顺序返回它们

我正试图遵循这些,但没有运气

现在,我将此作为适配器类:

package com.ibc.android.demo.appslist.app;

import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
import android.view.View.OnClickListener;

import com.spicycurryman.getdisciplined10.app.R;

import java.util.List;

public class ApkAdapter extends BaseAdapter {


    List<PackageInfo> packageList;
    Activity context;
    PackageManager packageManager;
    boolean[] itemChecked;

    public ApkAdapter(Activity context, List<PackageInfo> packageList,
                      PackageManager packageManager) {
        super();
        this.context = context;
        this.packageList = packageList;
        this.packageManager = packageManager;
        itemChecked = new boolean[packageList.size()];
    }

    private class ViewHolder {
        TextView apkName;
        CheckBox ck1;
    }

    public int getCount() {
        return packageList.size();
    }

    public Object getItem(int position) {
        return packageList.get(position);
    }

    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        LayoutInflater inflater = context.getLayoutInflater();

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.installed_apps, null);
            holder = new ViewHolder();

            holder.apkName = (TextView) convertView
                    .findViewById(R.id.appname);
            holder.ck1 = (CheckBox) convertView
                    .findViewById(R.id.checkBox1);

            convertView.setTag(holder);
             //holder.ck1.setTag(packageList.get(position));

        } else {

            holder = (ViewHolder) convertView.getTag();
        }
        // ViewHolder holder = (ViewHolder) convertView.getTag();
        PackageInfo packageInfo = (PackageInfo) getItem(position);

        Drawable appIcon = packageManager
                .getApplicationIcon(packageInfo.applicationInfo);
        String appName = packageManager.getApplicationLabel(
                packageInfo.applicationInfo).toString();
        appIcon.setBounds(0, 0, 75, 75);
        holder.apkName.setCompoundDrawables(appIcon, null, null, null);
        holder.apkName.setCompoundDrawablePadding(15);
        holder.apkName.setText(appName);
        holder.ck1.setChecked(false);

        if (itemChecked[position])
            holder.ck1.setChecked(true);
        else
            holder.ck1.setChecked(false);

        holder.ck1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if (holder.ck1.isChecked())
                    itemChecked[position] = true;
                else
                    itemChecked[position] = false;
            }
        });

        return convertView;

    }



}
这是我的一个java类。此应用程序用于返回用户安装的应用程序:

package com.spicycurryman.getdisciplined10.app;

import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

import com.ibc.android.demo.appslist.app.ApkAdapter;

import java.util.ArrayList;
import java.util.List;



public class InstalledAppActivity extends Fragment
        implements OnItemClickListener {

    PackageManager packageManager;
    ListView apkList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        setHasOptionsMenu(true);
        View rootView = inflater.inflate(R.layout.user_installed, container, false);
        packageManager = getActivity().getPackageManager();
        List<PackageInfo> packageList = packageManager
                .getInstalledPackages(PackageManager.GET_PERMISSIONS);

        List<PackageInfo> packageList1 = new ArrayList<PackageInfo>();

        /*To filter out System apps*/
        for(PackageInfo pi : packageList) {
            boolean b = isSystemPackage(pi);
            if(!b) {
                packageList1.add(pi);
            }
        }
        apkList = (ListView) rootView.findViewById(R.id.applist);
        apkList.setAdapter(new ApkAdapter(getActivity(), packageList1, packageManager));

        apkList.setOnItemClickListener(this);

        return rootView;

    }

    /**
     * Return whether the given PackgeInfo represents a system package or not.
     * User-installed packages (Market or otherwise) should not be denoted as
     * system packages.
     *
     * @param pkgInfo
     * @return boolean
     */
    private boolean isSystemPackage(PackageInfo pkgInfo) {
        return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true
                : false;
    }


// Don't need in Fragment
/*@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.block, menu);
   // super.onCreateOptionsMenu(menu,inflater);
}*/

    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

    }
}

要在Java中对列表进行排序,最简单的方法是使用。你只需要一个合适的比较器

我假设您想按应用程序名排序。在这种情况下,您可以使用如下内容:

final PackageItemInfo.DisplayNameComparator comparator = new PackageItemInfo.DisplayNameComparator(packageManager);

Collections.sort(packageList1, new Comparator<PackageInfo>()
{
    @Override
    public int compare(PackageInfo lhs, PackageInfo rhs)
    {
        return comparator.compare(lhs.applicationInfo, rhs.applicationInfo);
    }
});
如果要按包名排序,则更简单:

Collections.sort(packageList1, new Comparator<PackageInfo>()
{
    @Override
    public int compare(PackageInfo lhs, PackageInfo rhs)
    {
        return String.CASE_INSENSITIVE_ORDER.compare(lhs.packageName, rhs.packageName);
    }
});

要在Java中对列表进行排序,最简单的方法是使用。你只需要一个合适的比较器

我假设您想按应用程序名排序。在这种情况下,您可以使用如下内容:

final PackageItemInfo.DisplayNameComparator comparator = new PackageItemInfo.DisplayNameComparator(packageManager);

Collections.sort(packageList1, new Comparator<PackageInfo>()
{
    @Override
    public int compare(PackageInfo lhs, PackageInfo rhs)
    {
        return comparator.compare(lhs.applicationInfo, rhs.applicationInfo);
    }
});
如果要按包名排序,则更简单:

Collections.sort(packageList1, new Comparator<PackageInfo>()
{
    @Override
    public int compare(PackageInfo lhs, PackageInfo rhs)
    {
        return String.CASE_INSENSITIVE_ORDER.compare(lhs.packageName, rhs.packageName);
    }
});

我应该如何在我的系统中实现这一点case@XiJiaopin在执行apkList.setAdapter之前,只需为您想要的排序顺序包含这两个版本中的一个,我应该如何在我的case@XiJiaopin在执行apkList.setAdapter之前,只需为您想要的排序顺序包含这两个版本中的一个