java - 在从 json url 加载 listview 之前,在应用 getFilter() 时在 onQueryTextChange() 处给出错误

标签 java android json listview search

我是android开发新手,我已经实现了SearchFilter给我的SearchView 。我将过滤器应用于我的 listview它给了我正确的结果。 问题是,当 listview仍在加载...当时如果单击搜索编辑文本,我的应用程序就会崩溃...

我的代码:

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

    }
}

我的 Activity 代码

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错误

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

最佳答案

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

这里也改一下

 @Override
    public boolean onQueryTextChange(String newText) {
    if (cityadapter != null) {
        cityadapter.getFilter().filter(newText);
        }
        return false;
    }

关于java - 在从 json url 加载 listview 之前,在应用 getFilter() 时在 onQueryTextChange() 处给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37853083/

相关文章:

java - EJB3.0的Servlet 2.5注入(inject),全部打包为WAR

json - 为什么 JSON 文件比具有相同内容的 .txt 文件小很多?

php - 在 AngularJs 中使用 MySQL 和 PHP 嵌套 JSON 数据 | ng选项

Java-ajax跨站空响应字符串

java - 如何将可序列化类发送到具有所有字段的其他 Activity ?

android - Android 版 OpenCV 能否利用标准 C++ 支持在适用于 Windows 的 Android Studio 2.2 上获得 native 构建支持?

android - SoundCloud API 有配额限制吗?

Android - 你可以让多个应用程序发布相同的 Intent 吗?

jquery - $.ajax 和 JSONP。 ParseError 和未捕获的语法错误 : Unexpected token :

java - 数据表/AjaxFallbackDefaultDataTable : How to configure the top toolbar?