0

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

Janki Gadhiya
  • 4,492
  • 2
  • 29
  • 59

1 Answers1

1
 @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        if (YourAdapter != null) {

            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);
        }
    }

Change here too

 @Override
    public boolean onQueryTextChange(String newText) {
    if (cityadapter != null) {
        cityadapter.getFilter().filter(newText);
        }
        return false;
    }
Sohail Zahid
  • 8,099
  • 2
  • 25
  • 41