微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

搜索适配器-空对象引用上的'java.lang.Object [] java.util.Collection.toArray'

如何解决搜索适配器-空对象引用上的'java.lang.Object [] java.util.Collection.toArray'

我制作了一个SearchAdapter来实时过滤项目,但是有NPE,我不知道该怎么做... 有时它可以工作,但可以提供NPE并关闭应用程序。

这些是我制作此适配器所遵循的链接- https://codinginflow.com/tutorials/android/searchview-recyclerview https://www.youtube.com/watch?v=ujKDN_ZtGHQ

这是适配器代码错误日志。

public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchViewHolder> implements Filterable {

private ArrayList<SearchItem> searchList;
private ArrayList<SearchItem> searchListFull;
private Selectedplace selectedplace;

class SearchViewHolder extends RecyclerView.ViewHolder {
    ImageView imageView;
    TextView searchPlace;
    TextView searchFolder;
    SearchViewHolder(View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.image_view);
        searchPlace = itemView.findViewById(R.id.text_view1);
        searchFolder = itemView.findViewById(R.id.text_view2);

        itemView.setonClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                selectedplace.selectedplace(searchList.get(getAdapterPosition()));
            }
        });
    }
}
SearchAdapter(ArrayList<SearchItem> searchList,Selectedplace selectedplace) {
    this.searchList = searchList;
    searchListFull = new ArrayList<>(searchList);
    this.selectedplace = selectedplace;
}
@NonNull
@Override
public SearchAdapter.SearchViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_item,parent,false);
    return new SearchViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull SearchAdapter.SearchViewHolder holder,int position) {
    SearchItem currentItem = searchList.get(position);
    if(currentItem.getAttempts() < 3){
        holder.imageView.setimageResource(R.drawable.ps_place_under);
    } else if(currentItem.getStarred() == 0){
        holder.imageView.setimageResource(R.drawable.ps_place_over);
    } else {
        holder.imageView.setimageResource(R.drawable.ic_star_chk_24dp);
    }
    holder.searchPlace.setText(currentItem.getPlace());
    holder.searchFolder.setText(currentItem.getFolder());
}
@Override
public int getItemCount() {
    return searchList.size();
}

public interface Selectedplace{
    void selectedplace(SearchItem searchItem);
}

@Override
public Filter getFilter() {
    return searchFilter;
}
private Filter searchFilter = new Filter() {
    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        List<SearchItem> filteredList = new ArrayList<>();
        if (constraint == null || constraint.length() == 0) {
            filteredList.addAll(searchListFull);
        } else {
            String filterPattern = constraint.toString().toLowerCase().trim();
            for (SearchItem item : searchListFull) {
                if (item.getFolder().toLowerCase().contains(filterPattern)) {
                    filteredList.add(item);
                }
                else if (item.getPlace().toLowerCase().contains(filterPattern)){
                    filteredList.add(item);
                }
            }
        }
        FilterResults results = new FilterResults();
        results.values = filteredList;
        return results;
    }
    @Override
    protected void publishResults(CharSequence constraint,FilterResults results) {
        searchList.clear();
        searchList.addAll((List) results.values);
        notifyDataSetChanged();
    }
};

}

错误日志--------------------------------------------- -------------------------------

java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] 

java.util.Collection.toArray()' on a null object reference      
at java.util.ArrayList.addAll(ArrayList.java:588)
        at com.ljh.Getout.SearchAdapter$1.publishResults(SearchAdapter.java:104)
        at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:284)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

解决方法

您的results.values可能为null,或者它可能包含其他对象而不是SearchItem。您应该多加小心,以防止发生此类错误。

尝试这样的事情:

@Override
protected void publishResults(CharSequence constraint,FilterResults results) 
{
    searchList.clear();
    if(results.values instanceof List){
        for(Object item : (List<Object>)results.values){
            if(item instanceof SearchItem){
                searchList.add((SearchItem) item);
            }
        }
    }
    notifyDataSetChanged();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。