如何以字母顺序返回安装的应用程序列表 [英] How to return list of installed Apps in alphabetical order

查看:175
本文介绍了如何以字母顺序返回安装的应用程序列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的Andr​​oid项目,我想在滚动标签的actionbaractivity

内返回用户安装和系统应用的两个片段列表中的字母

我用了一个自定义适配器类来获取应用程序的列表,并有code在列表视图返回无论用户安装或pre-安装的应用程序。不过,我想在这两个字母顺序归还。

我想请按照下列但没有运气。

http://www.androprogrammer.com/2013/10/list-view-with-check-box-using-custom.html

的按字母顺序排列列出已安装的应用

现在我有这个作为我的适配器类别:

 包com.ibc.android.demo.appslist.app;进口android.app.Activity;
进口android.content.pm.PackageInfo;
进口android.content.pm.PackageManager;
进口android.graphics.drawable.Drawable;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.BaseAdapter;
进口android.widget.CheckBox;
进口android.widget.TextView;
进口android.view.View.OnClickListener;进口com.spicycurryman.getdisciplined10.app.R;进口的java.util.List;公共类ApkAdapter延伸BaseAdapter {
    清单< PackageInfo> packageList;
    活动背景;
    软件包管理系统软件包管理系统;
    布尔[] itemChecked;    公共ApkAdapter(Activity上下文,列表< PackageInfo> packageList,
                      软件包管理系统软件包管理系统){
        超();
        this.context =背景;
        this.packageList = packageList;
        this.packageManager =软件包管理系统;
        itemChecked =新的布尔[packageList.size()];
    }    私有类ViewHolder {
        TextView的apkName;
        复选框CK1;
    }    公众诠释的getCount(){
        返回packageList.size();
    }    公共对象的getItem(INT位置){
        返回packageList.get(位置);
    }    众长getItemId(INT位置){
        返回0;
    }    @覆盖
    公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){
        最后ViewHolder持有人;        LayoutInflater吹气= context.getLayoutInflater();        如果(convertView == NULL){
            convertView = inflater.inflate(R.layout.installed_apps,NULL);
            持有人=新ViewHolder();            holder.apkName =(TextView中)convertView
                    .findViewById(R.id.appname);
            holder.ck1 =(复选框)convertView
                    .findViewById(R.id.checkBox1);            convertView.setTag(保持器);
             //holder.ck1.setTag(packageList.get(position));        }其他{            支架=(ViewHolder)convertView.getTag();
        }
        // ViewHolder支架=(ViewHolder)convertView.getTag();
        PackageInfo packageInfo =(PackageInfo)的getItem(位置);        可绘制APPICON =软件包管理系统
                .getApplicationIcon(packageInfo.applicationInfo);
        字符串的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(假);        如果(itemChecked [位置])
            holder.ck1.setChecked(真);
        其他
            holder.ck1.setChecked(假);        holder.ck1.setOnClickListener(新OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                // TODO自动生成方法存根
                如果(holder.ck1.isChecked())
                    itemChecked [位置] =真;
                其他
                    itemChecked [位置] = FALSE;
            }
        });        返回convertView;    }}

这是我的Java类之一。这一个是返回用户安装的应用程序:

 包com.spicycurryman.getdisciplined10.app;进口android.content.pm.ApplicationInfo;
进口android.content.pm.PackageInfo;
进口android.content.pm.PackageManager;
进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.AdapterView;
进口android.widget.AdapterView.OnItemClickListener;
进口android.widget.ListView;进口com.ibc.android.demo.appslist.app.ApkAdapter;进口的java.util.ArrayList;
进口的java.util.List;公共类InstalledAppActivity扩展片段
        实现OnItemClickListener {    软件包管理系统软件包管理系统;
    ListView的apkList;    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                             捆绑savedInstanceState){        setHasOptionsMenu(真);
        查看rootView = inflater.inflate(R.layout.user_installed,集装箱,FALSE);
        软件包管理系统= getActivity()getPackageManager()。
        清单< PackageInfo> packageList =软件包管理系统
                .getInstalledPackages(PackageManager.GET_PERMISSIONS);        清单< PackageInfo> packageList1 =新的ArrayList< PackageInfo>();        / *要过滤掉系统应用* /
        对于(PackageInfo PI:packageList){
            布尔B = isSystemPackage(PI);
            如果(!B){
                packageList1.add(PI);
            }
        }
        apkList =(ListView控件)rootView.findViewById(R.id.applist);
        apkList.setAdapter(新ApkAdapter(getActivity(),packageList1,软件包管理系统));        apkList.setOnItemClickListener(本);        返回rootView;    }    / **
     *给定PackgeInfo返回是否重新presents系统软件包或没有。
     *用户安装的软件包(市场或其他方式)不应该被表示为
     *系统软件​​包。
     *
     * @参数PKGINFO
     * @返回布尔
     * /
    私人布尔isSystemPackage(PackageInfo PKGINFO){
        返回((pkgInfo.applicationInfo.flags&放大器;!ApplicationInfo.FLAG_SYSTEM)= 0)?真正
                :假的;
    }
//不要需要片段
/ * @覆盖
公共无效onCreateOptionsMenu(菜单菜单,MenuInflater气筒){
    inflater.inflate(R.menu.block,菜单);
   // super.onCreateOptionsMenu(菜单,充气器);
} * /    @覆盖
    公共无效onItemClick(适配器视图<>适配器视图,视图观点,INT I,长L){    }
}


解决方案

要进行排序在Java中列出,最简单的方法是使用<一个href=\"http://developer.android.com/reference/java/util/Collections.html#sort%28java.util.List%3CT%3E,%20java.util.Comparator%3C?%20super%20T%3E%29\"相对=nofollow> Col​​lections.sort() 。你只需要一个合适的比较&LT;方式&gt;

我假设你要排序的应用程序名的。在这种情况下,你可以使用这样的:

 最后PackageItemInfo.DisplayNameComparator比较=新PackageItemInfo.DisplayNameComparator(软件包管理系统);Collections.sort(packageList1,新的比较&LT; PackageInfo&GT;()
{
    @覆盖
    公众诠释比较(PackageInfo LHS,PackageInfo RHS)
    {
        返回执行comparator.compare(lhs.applicationInfo,rhs.applicationInfo);
    }
});

如果您想通过的排序包名的,这是更简单:

  Col​​lections.sort(packageList1,新的比较&LT; PackageInfo&GT;()
{
    @覆盖
    公众诠释比较(PackageInfo LHS,PackageInfo RHS)
    {
        返回String.CASE_INSENSITIVE_ORDER.compare(lhs.packageName,rhs.packageName);
    }
});

In my Android project, I am trying to return a list of user-installed and system apps alphabetically in two fragments within an actionbaractivity in scrollable tabs

I used an custom adapter class to get the list of apps and have code to return either user-installed or pre-installed apps in the listview. However, I am trying to return them in both alphabetical order.

I am trying to follow these but no luck.

http://www.androprogrammer.com/2013/10/list-view-with-check-box-using-custom.html

Alphabetize List of Installed Apps

Right now I have this as my Adapter Class:

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;

    }



}

And here is one of my java classes. This one is for returning the user-installed apps:

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) {

    }
}

解决方案

To sort lists in Java, the simplest way is to use Collections.sort(). You just need an appropriate Comparator<?>.

I assume you want to sort by application name. In that case you can use something like this:

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);
    }
});

If you want to sort by package name, it's even simpler:

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

这篇关于如何以字母顺序返回安装的应用程序列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆