I am new in android development ,I have implemented SearchFilter
to my SearchView
. I applied filter to my listview
and it giving me correct result.
the problem is that, when listview
is still loading ...at that time if click on search edit text,my app gets crash....
My Code:
public class CityAdapter extends BaseAdapter implements Filterable {
ValueFilter valueFilter;
private ArrayList<City> cityList;
private ArrayList<City> mStringFilterList;
private Context context;
private LayoutInflater layoutInflater;
public CityAdapter(Context context, ArrayList<City> cityList) {
this.context = context;
this.cityList = cityList;
mStringFilterList = cityList;
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return cityList.size();
}
@Override
public Object getItem(int position) {
return cityList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
if (valueFilter == null) {
valueFilter = new ValueFilter();
}
return valueFilter;
}
public class Holder {
RobotoTextView cityName_txt;
TextView cityId_txt;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Holder holder;
if (convertView == null) {
holder = new Holder();
convertView = layoutInflater.inflate(R.layout.city_list_item, null);
holder.cityName_txt = (RobotoTextView) convertView.findViewById(R.id.citytxt);
holder.cityId_txt = (TextView) convertView.findViewById(R.id.idtxt);
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
}
holder.cityName_txt.setText(cityList.get(position).getCity_Name());
holder.cityId_txt.setText(cityList.get(position).getCity_Id());
return convertView;
}
private class ValueFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
ArrayList<City> filterList = new ArrayList<City>();
for (int i = 0; i < mStringFilterList.size(); i++) {
if ((mStringFilterList.get(i).getCity_Name().toUpperCase())
.contains(constraint.toString().toUpperCase())) {
City city = new City(mStringFilterList.get(i)
.getCity_Id(), mStringFilterList.get(i)
.getCity_Name());
filterList.add(city);
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = mStringFilterList.size();
results.values = mStringFilterList;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
cityList = (ArrayList<City>) results.values;
notifyDataSetChanged();
}
}
}
my activity code
search_view.setOnQueryTextListener(this);
lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String itemId = (String) lv.getItemAtPosition(position).toString();
Toast.makeText(context,"position="+itemId,Toast.LENGTH_LONG).show();
Intent i_details = new Intent(DharmshalaCities.this, DharmshalaDetailsActivity.class);
i_details.putExtra("itemId", itemId);
startActivity(i_details);
}
});
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
cityadapter.getFilter().filter(newText);
return false;
}
//and giving error to this line of code //cityadapter.getFilter().filter(newText);
logcat error
06-16 07:22:19.326 23888-23888/com.newsoftsolutions.android.padamashligotram E/AndroidRuntime: FATAL EXCEPTION: main Process: com.newsoftsolutions.android.padamashligotram, PID: 23888 java.lang.NullPointerException: Attempt to invoke virtual method 'android.widget.Filter com.newsoftsolutions.android.padamashligotram.adapter.CityAdapter.getFilter()' on a null object reference at com.newsoftsolutions.android.padamashligotram.DharmshalaCities.onQueryTextChange(DharmshalaCities.java:76) at android.widget.SearchView.onTextChanged(SearchView.java:1257) at android.widget.SearchView.access$2000(SearchView.java:95) at android.widget.SearchView$11.onTextChanged(SearchView.java:1737) at android.widget.TextView.sendOnTextChanged(TextView.java:7749) at android.widget.TextView.handleTextChanged(TextView.java:7809) at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9727) at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:964) at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:515) at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:454) at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:33) at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:685) at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:197) at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:184) at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:286) at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:78) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5289) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 06-16 07:22:20.643 23888-24385/com.newsoftsolutions.android.padamashligotram E/pass 1: connection success