Android:基本适配器空指针
很抱歉这个标题,但这是一个我似乎无法总结的问题 因此,我创建了一个扩展AutoCompleteTextView的类 我创建了一个实现可过滤接口的基本适配器类 我设置了这个适配器 当调用getCount时,我得到一个null指针,它表示数组列表为null。这就是事情变得奇怪的地方 这是我的基本适配器构造函数Android:基本适配器空指针,android,Android,很抱歉这个标题,但这是一个我似乎无法总结的问题 因此,我创建了一个扩展AutoCompleteTextView的类 我创建了一个实现可过滤接口的基本适配器类 我设置了这个适配器 当调用getCount时,我得到一个null指针,它表示数组列表为null。这就是事情变得奇怪的地方 这是我的基本适配器构造函数 public PieceSearchAdapter(Context context, ArrayList<Food> food) { mContext = context;
public PieceSearchAdapter(Context context, ArrayList<Food> food) {
mContext = context;
mFoods = new ArrayList<>();
mFoods.addAll(food);
}
空指针仍然存在
因此,我在基本适配器构造函数中进行了调试。传入的项不为null,并且包含这些项
我不确定是什么问题
堆栈跟踪:
java.lang.NullPointerException
at REDACTED.FoodSearchAdapter.getCount(PieceSearchAdapter.java:36)
at android.widget.AutoCompleteTextView$PopupDataSetObserver$1.run(AutoCompleteTextView.java:1291)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5356)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
at dalvik.system.NativeStart.main(Native Method)
尝试过Karan-Mer解决方案
private List<Food> mFoods;
public PieceSearchAdapter(Context context, ArrayList<Food> food) {
mContext = context;
mFoods = new ArrayList<Food>(food);
}
Rohan解决方案
private List<Food> mFoods;
public PieceSearchAdapter(Context context, ArrayList<Food> food) {
mContext = context;
mFoods = new ArrayList<Food>(food);
}
不是一次尝试,但它是一样的
@Override
public int getCount() {
if(mPieces != null){
return mPieces.size();
}
return 0;
}
不会崩溃,但在更改AutoCompleteTextView的文本以运行筛选操作时,会出现以下异常
344-962/W/Filter﹕ An exception occured during performFiltering()!
java.lang.NullPointerException
at REDACTED.FoodSearchAdapter$FoodFilter.performFiltering(FoodSearchAdapter.java:108)
at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.os.HandlerThread.run(HandlerThread.java:61)
这是108线。从哪里开始
for (Food food : mFood) {
if (food.getReferenceNumber().matches("(?i:.*" + constraint + ".*)") || piece.getName().matches("(?i:.*" + constraint + ".*)")) {
filteredFoods.add(food);
}
}
基本上,成员mFoods再次为空:(
我的整个筛选逻辑
private class FoodFilter extends Filter {
/**
* Filter the data based on a pattern in a worker thread
*
* @return FilterResults: Contains two members, a count indicating the amount of results and the data itself
*/
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
//Do we have any constraints passed in?
if (!TextUtils.isEmpty(constraint)) {
ArrayList<Food> filteredFood = new ArrayList<>();
for (Food food : mFood) {
if (food.getReferenceNumber().matches("(?i:.*" + constraint + ".*)") || food.getName().matches("(?i:.*" + constraint + ".*)")) {
filteredFood.add(food);
}
}
results.count = filteredFood.size();
results.values = filtered;
}
return results;
}
因此,基本适配器有问题,但我不确定。至少这证明了我提供的数据是好的,否则这将无法工作。修复了该问题
博扬·利耶夫斯基和罗汉·帕瓦尔指出了我的一些问题
关键问题就在这里
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
if (filterResults != null) {
mFood = (ArrayList<Food>) filterResults.values;
notifyDataSetChanged();
}
}
@覆盖
受保护的无效发布结果(CharSequence CharSequence、FilterResults FilterResults){
如果(filterResults!=null){
mFood=(ArrayList)filterResults.values;
notifyDataSetChanged();
}
}
因此FilterResults从不为null,但values成员可以为null,因此在这里,当未找到任何结果时,我将我的mFood成员设置为null。由于我没有设置阈值,因此没有字符会立即使我的成员数组列表为null。请使用null指针
解决方案是创建另一个这样的数组列表
private ArrayList<Food> mOriginalFoodPieces;
private ArrayList<Food> mFilteredPiecesToShow = new ArrayList<>();
private final Context mContext;
public PieceSearchAdapter(Context context, ArrayList<Food> food) {
mContext = context;
mOriginalFood = food;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
DebugUtils.Log("publishResults called");
Object filterResult = filterResults.values;
if(filterResult != null){
mFilteredFoodToShow = (ArrayList<Food>) filterResult;
}
else{
mFilteredFoodToShow.clear();
}
notifyDataSetChanged();
}
private ArrayList moriginalfoodpiees;
私有ArrayList mFilteredPiecesToShow=新ArrayList();
私有最终上下文mContext;
公共片段搜索适配器(上下文、ArrayList食物){
mContext=上下文;
mOriginalFood=食物;
}
因此,所有其他方法(如getCount和getView)都将使用mFilteredPiecesToShow数组列表。不要触摸mOriginalFood数组列表,因为我们需要保留数据集以进行过滤
publishResults方法如下所示
private ArrayList<Food> mOriginalFoodPieces;
private ArrayList<Food> mFilteredPiecesToShow = new ArrayList<>();
private final Context mContext;
public PieceSearchAdapter(Context context, ArrayList<Food> food) {
mContext = context;
mOriginalFood = food;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
DebugUtils.Log("publishResults called");
Object filterResult = filterResults.values;
if(filterResult != null){
mFilteredFoodToShow = (ArrayList<Food>) filterResult;
}
else{
mFilteredFoodToShow.clear();
}
notifyDataSetChanged();
}
@覆盖
受保护的无效发布结果(CharSequence CharSequence、FilterResults FilterResults){
Log(“publishResults调用”);
对象filterResult=filterResults.values;
如果(filterResult!=null){
mFilteredFoodToShow=(ArrayList)filterResult;
}
否则{
mFilteredFoodToShow.clear();
}
notifyDataSetChanged();
}
不要复制值然后添加它们,而是尝试使用列出this.mFoods=new ArrayList(oldList);
尝试mFoods=new ArrayList();
@KaranMer请检查我的编辑。我尝试了解决方案,但得到了相同的问题add try catch surrond mFoods.size()在catch return 0中;@BojanIlievski我对代码感到困惑。没有使用filterString。列表是相等的成员“item”引用。不需要for循环外的食物对象。另外,“list”集合将为null,因为它的引用指向成员“items”。我遇到的问题是成员数组列表为null
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
if (filterResults != null) {
mFood = (ArrayList<Food>) filterResults.values;
notifyDataSetChanged();
}
}
private ArrayList<Food> mOriginalFoodPieces;
private ArrayList<Food> mFilteredPiecesToShow = new ArrayList<>();
private final Context mContext;
public PieceSearchAdapter(Context context, ArrayList<Food> food) {
mContext = context;
mOriginalFood = food;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
DebugUtils.Log("publishResults called");
Object filterResult = filterResults.values;
if(filterResult != null){
mFilteredFoodToShow = (ArrayList<Food>) filterResult;
}
else{
mFilteredFoodToShow.clear();
}
notifyDataSetChanged();
}