如何使用自定义过滤器搜索过滤应用程序名称和包名称

时间:2013-10-20 19:05:06

标签: android

我在用户安装的应用程序列表中使用自定义过滤器来搜索功能。它工作得很好,但搜索仅适用于搜索应用程序包名称。换句话说,它只搜索包名称而不是实际的应用程序名称。例如,要搜索gmail,如果我输入“gmail”,我就没有结果,而如果我搜索“gm”,我会在结果中获得gmail,因为它是gmail程序包名称的一部分。

我想搜索包名和应用程序名,但是我怎么能这样做呢?这是我的编码:

    @Override
public Filter getFilter() {
    if(filter == null) {
        filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();
                List<ApplicationInfo> myFilteredAppList = new ArrayList<ApplicationInfo>();
                constraint = constraint.toString().toLowerCase();

                if (constraint.length() == 0) {
                    myFilteredAppList.addAll(originalListAppInfo);

                }

                for (ApplicationInfo appInfo : originalListAppInfo) {
                    String somefield = appInfo.packageName;
                    if (somefield.toLowerCase().contains(constraint.toString())) {
                        myFilteredAppList.add(appInfo);
                    }
                }
                results.count = myFilteredAppList.size();
                results.values = myFilteredAppList;
                return results;
            }


            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                if(results.values != null)
                {
                mListAppInfo = (List<ApplicationInfo>)results.values;
                notifyDataSetChanged();
                }
            }
        };
    }
    return filter;
}

我在此行中过滤搜索:

String somefield = appInfo.packageName;

你可以看到它只过滤packageName而不是packageName和ApplicationName。

ADDED ERROR:

enter image description here

1 个答案:

答案 0 :(得分:0)

试试这个。

for (ApplicationInfo appInfo : originalListAppInfo) {
       String somefield = appInfo.packageName;
       String name = appInfo.name;

          if (somefield.toLowerCase().contains(constraint.toString().toLowerCase().toString())
                ||name.toLowerCase().contains(constraint.toString().toLowerCase().toString()) {
                  myFilteredAppList.add(appInfo);
          }
    }