I am developing an application. In which a list view is displayed in which the data is coming from SQLite data base. I am getting data in String[].
Now the need of application is that : I want to add a search bar in top of the activity. This search bar should perform search only on the list showing on the activity.
When user type a letter in search bar all the data should display in list view who is containing that letter.
I tried the following code.
In 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);
And in Adapter class :
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;
}
};
}
What should i do for this. The data is in String[]. Display in list view.
Please suggest me what changes are required.
When i applied above code and run my app and tried to search, I got error as :
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)