SearchView不会过滤ListView中的正确应用程序

时间:2016-03-29 18:39:36

标签: android listview search android-arrayadapter searchview

我有一个ListView,显示我已安装的应用程序。我想要一个SearchView过滤掉与我的搜索不匹配的应用。我怎样才能做到这一点?我试过了:

SearchView sv;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e("Test29", "93");
    setContentView(R.layout.activity_apps_list);
    sv = (SearchView) findViewById(R.id.searchView1);

    loadApps();
    loadListView();
    addClickListener();
}


private PackageManager manager;
private List<AppDetail> apps;

private void loadApps(){
    manager = getPackageManager();
    apps = new ArrayList<AppDetail>();

    Intent i = new Intent(Intent.ACTION_MAIN, null);
    i.addCategory(Intent.CATEGORY_LAUNCHER);

    List<ResolveInfo> availableActivities = manager.queryIntentActivities(i, 0);
    for(ResolveInfo ri:availableActivities){
        AppDetail app = new AppDetail();
        app.label = ri.loadLabel(manager);
        app.name = ri.activityInfo.packageName;
        app.icon = ri.activityInfo.loadIcon(manager);
        apps.add(app);
    }
    Log.e("Test29", "93");
}



private ListView list;

private void loadListView(){
    list = (ListView)findViewById(R.id.apps_list);

    final ArrayAdapter<AppDetail> adapter = new ArrayAdapter<AppDetail>(this, R.layout.list_item, apps) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if(convertView == null){
                convertView = getLayoutInflater().inflate(R.layout.list_item, null);
            }

            ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon);
            appIcon.setImageDrawable(apps.get(position).icon);

            TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_label);
            appLabel.setText(apps.get(position).label);

            return convertView;
        }
    };

    Log.e("Test29", "93");

    Collections.sort(apps, new Comparator<AppDetail>() {

/* This comparator will sort AppDetail objects alphabetically. */

        @Override
        public int compare(AppDetail a1, AppDetail a2) {

            // String implements Comparable
            return (a1.label.toString()).compareTo(a2.label.toString());
        }
    });

    list.setAdapter(adapter);

现在,当您开始输入

时,应用程序会被过滤掉
//the part where apps get filtered
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
        @Override
        public void run() {

            sv.setOnQueryTextListener(new SearchView.OnQueryTextListener()

                                      {
                                          @Override
                                          public boolean onQueryTextSubmit(String text) {
                                              return false;
                                          }

                                          @Override
                                          public boolean onQueryTextChange(String text) {

                                              adapter.getFilter().filter(text);

                                              return false;
                                          }
                                      }

            );


        }
    }, 10000);

这是AppDetail类:

public class AppDetail {

    CharSequence label;
    CharSequence name;
    Drawable icon;
}

但是当我开始打字时,什么都没有显示出来。如果我开始为“Facebook”键入“Fa”,Facebook就会消失。我把它放在处理程序中的原因是因为我认为它需要一些时间来加载所有的应用程序。

0 个答案:

没有答案