Android:基本适配器空指针

Android:基本适配器空指针,android,Android,很抱歉这个标题,但这是一个我似乎无法总结的问题 因此,我创建了一个扩展AutoCompleteTextView的类 我创建了一个实现可过滤接口的基本适配器类 我设置了这个适配器 当调用getCount时,我得到一个null指针,它表示数组列表为null。这就是事情变得奇怪的地方 这是我的基本适配器构造函数 public PieceSearchAdapter(Context context, ArrayList<Food> food) { mContext = context;

很抱歉这个标题,但这是一个我似乎无法总结的问题

因此,我创建了一个扩展AutoCompleteTextView的类

我创建了一个实现可过滤接口的基本适配器类

我设置了这个适配器

当调用getCount时,我得到一个null指针,它表示数组列表为null。这就是事情变得奇怪的地方

这是我的基本适配器构造函数

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