Java 筛选器-结果如何可以为null而不是大小为0的数组
下面是适配器中的简单筛选器类:Java 筛选器-结果如何可以为null而不是大小为0的数组,java,android,filter,Java,Android,Filter,下面是适配器中的简单筛选器类: public class Adapter extends ArrayAdapter<T> { private List<T> origItems; private List<T> filteredData = null; private ItemFilter mFilter = new ItemFilter(); public AdapterAppOrContact(Context contex
public class Adapter extends ArrayAdapter<T>
{
private List<T> origItems;
private List<T> filteredData = null;
private ItemFilter mFilter = new ItemFilter();
public AdapterAppOrContact(Context context, List<T> items)
{
super(context, R.layout.row_adapter_app, items);
origItems = items;
filteredData = items;
}
@Override
public int getCount() {
return filteredData.size();
}
// ....
private class ItemFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
String filterString = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
final List<T> list = origItems;
int count = list.size();
final ArrayList<T> newList = new ArrayList<T>(count);
String filterableString ;
for (int i = 0; i < count; i++)
{
filterableString = list.get(i).getName();
if (filterableString.toLowerCase().contains(filterString))
{
newList.add(list.get(i));
}
}
results.values = newList;
results.count = newList.size();
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
filteredData = (ArrayList<T>) results.values;
notifyDataSetChanged();
}
}
}
发布您的FilterResults类代码环境是多线程的吗?您是说您正在使用非空值调用
publishResults
?您如何知道,您正在使用调试器?FilterResults
是一个嵌套在基android.widget.Filter
类中的类。我不知道publishResults
调用时使用非null,但我知道是因为一个崩溃报告,之后的notifyDataSetChanged
将通知适配器,该适配器将访问Filteredata
变量,这将与NullPointerException
崩溃,因为Filteredata
是null@markspace没错,过滤是异步完成的,我没有地方将filteredData
设置为null,并且在主线程上调用publishResults
。一种可能的解释是根本不调用publishResults(…)
。如果通过未检查的异常执行过滤
,会发生这种情况吗?如果items
/origItems
为null
,会发生什么情况?发布过滤器结果类代码是多线程环境吗?您是说您正在使用非空值调用publishResults
?您如何知道,您正在使用调试器?FilterResults
是一个嵌套在基android.widget.Filter
类中的类。我不知道publishResults
调用时使用非null,但我知道是因为一个崩溃报告,之后的notifyDataSetChanged
将通知适配器,该适配器将访问Filteredata
变量,这将与NullPointerException
崩溃,因为Filteredata
是null@markspace没错,过滤是异步完成的,我没有地方将filteredData
设置为null,并且在主线程上调用publishResults
。一种可能的解释是根本不调用publishResults(…)
。如果通过未检查的异常执行过滤
,会发生这种情况吗?如果项
/源项
为空
,会发生什么情况?
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at com.app.package.adapters.AdapterAppOrContact.getCount(AdapterAppOrContact.java:40)
at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:828)
at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:6373)
at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:310)
at com.app.package.adapters.AdapterAppOrContact$ItemFilter.publishResults(AdapterAppOrContact.java:129)
...