我有一个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就会消失。我把它放在处理程序中的原因是因为我认为它需要一些时间来加载所有的应用程序。