我正在开发一个应用程序。在其中显示数据来自 SQLite 数据库的列表视图。我在 String[] 中获取数据。
现在应用程序的需要是:我想在活动顶部添加一个搜索栏。此搜索栏应仅对活动上显示的列表执行搜索。
当用户在搜索栏中键入一个字母时,所有数据都应显示在包含该字母的列表视图中。
我尝试了以下代码。
在 main.java
EditText search= (EditText) findViewById(R.id.edittext_searchbar);
search.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
adapter.getFilter().filter(s);
adapter.notifyDataSetChanged();
}
public void beforeTextChanged(CharSequence s, int start, int count,int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
listView.setAdapter(adapter);
在适配器类中:
public void setData(String[] menuList) {
menuListofAdapter = menuList;//contains class items data.
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
if (results != null && results.count >= 0) {
setData((String[]) results.values);//if results of search is null set the searched results data
} else {
setData(menuListofAdapter);// set original values
}
notifyDataSetInvalidated();
}
@SuppressWarnings("null")
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults result = new FilterResults();
if (!TextUtils.isEmpty(constraint)) {
constraint = constraint.toString();
String[] fItem = null;
if(Utility.mainMenuList!=null){
for(int i=0,j=0;i<Utility.mainMenuList.length;i++){
if (Utility.mainMenuList[i].equalsIgnoreCase(constraint.toString())) {
fItem[j] = Utility.mainMenuList[i];
j=j+1;
}else{
}
}
}
result.count = fItem.length;
result.values = fItem;
} else{
result.count=-1;// no search results found
}
return result;
}
};
}
我应该为此做些什么。数据在 String[] 中。在列表视图中显示。
请建议我需要进行哪些更改。
当我应用上面的代码并运行我的应用程序并尝试搜索时,出现以下错误:
03-12 18:16:19.215: D/AndroidRuntime(836): Shutting down VM
03-12 18:16:19.215: W/dalvikvm(836): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-12 18:16:19.215: E/AndroidRuntime(836): FATAL EXCEPTION: main
03-12 18:16:19.215: E/AndroidRuntime(836): java.lang.ClassCastException: java.util.ArrayList
03-12 18:16:19.215: E/AndroidRuntime(836): at com.abc.example.adapters.MyListAdapter$1.publishResults(MainMenuListAdapter.java:41)
03-12 18:16:19.215: E/AndroidRuntime(836): at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
03-12 18:16:19.215: E/AndroidRuntime(836): at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 18:16:19.215: E/AndroidRuntime(836): at android.os.Looper.loop(Looper.java:123)
03-12 18:16:19.215: E/AndroidRuntime(836): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-12 18:16:19.215: E/AndroidRuntime(836): at java.lang.reflect.Method.invokeNative(Native Method)
03-12 18:16:19.215: E/AndroidRuntime(836): at java.lang.reflect.Method.invoke(Method.java:507)
03-12 18:16:19.215: E/AndroidRuntime(836): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-12 18:16:19.215: E/AndroidRuntime(836): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-12 18:16:19.215: E/AndroidRuntime(836): at dalvik.system.NativeStart.main(Native Method)