我是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/