在我的应用程序中,我有一个用户安装的应用程序列表,并希望为该列表创建搜索功能。现在,这是我的编码:
// create new adapter
AppInfoAdapter adapter = new AppInfoAdapter(this, Utilities.getInstalledApplication(this), getPackageManager());
// load list application
mListAppInfo = (ListView)findViewById(R.id.lvApps);
// set adapter to list view
mListAppInfo.setAdapter(adapter);
// search bar
inputSearch = (EditText) findViewById(R.id.inputSearch);
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
// Drag_and_Drop_App.this.adapter.getFilter().filter(cs);
Drag_and_Drop_App.this.adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
当我在此行收到错误时会出现此问题:
Drag_and_Drop_App.this.adapter.getFilter().filter(cs);
它说我的基本适配器中没有定义“getFilter()”,这就是:
package com.example.awesomefilebuilderwidget;
IMPORTS
public class AppInfoAdapter extends BaseAdapter {
private Context mContext;
private List mListAppInfo;
private PackageManager mPackManager;
public AppInfoAdapter(Context c, List list, PackageManager pm) {
mContext = c;
mListAppInfo = list;
mPackManager = pm;
}
@Override
public int getCount() {
return mListAppInfo.size();
}
@Override
public Object getItem(int position) {
return mListAppInfo.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// get the selected entry
ApplicationInfo entry = (ApplicationInfo) mListAppInfo.get(position);
// reference to convertView
View v = convertView;
// inflate new layout if null
if(v == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
v = inflater.inflate(R.layout.layout_appinfo, null);
}
// load controls from layout resources
ImageView ivAppIcon = (ImageView)v.findViewById(R.id.ivIcon);
TextView tvAppName = (TextView)v.findViewById(R.id.tvName);
TextView tvPkgName = (TextView)v.findViewById(R.id.tvPack);
// set data to display
ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager));
tvAppName.setText(entry.loadLabel(mPackManager));
tvPkgName.setText(entry.packageName);
// return view
return v;
}
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return filter;
}
}
我在stackoverflow上查看了最后一部分“public Filter ...”。但是现在,我需要一个自定义过滤器来进行搜索。我可以用什么? (我已经尝试了一件事,但它不起作用)
答案 0 :(得分:0)
未定义方法getFilter()
,因为您的适配器必须实现Filterable接口,因此只需在适配器上添加“implements Filterable”:
public class AppInfoAdapter extends BaseAdapter implements Filterable {
// your stuff
}
和你的getFilter
@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();
for (ApplicationInfo appInfo : originalListAppInfo) {
String somefield = appInfo.getSomeField();
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) {
mListAppInfo = (List<ApplicationInfo>)results.values;
notifyDataSetChanged();
}
};
}
return filter;
}
请注意,我已经通过在创建适配器期间创建的原始列表(originalListAppInfo)的副本进行了迭代。
private List<ApplicationInfo> originalListAppInfo;
private List<ApplicationInfo> mListAppInfo;
private Filter filter;
public AppInfoAdapter(Context context, List<ApplicationInfo> listApp) {
this.context = context;
this.originalListAppInfo = this.mListAppInfo = listApp;
}
希望这有帮助。 :)