当前位置: 首页 > 知识库问答 >
问题:

搜索适配器-“java”。lang.Object[]java。util。收集空对象引用上的toArray()

齐凯康
2023-03-14

我做了一个实时过滤项目的搜索适配器,但是有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)

共有1个答案

陶山
2023-03-14

您的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();
}
 类似资料:
  • 我正在尝试从API获取一些数据,由于我将此回调指向空响应,因此出现以下错误: 如何在保持功能的同时修复它?这意味着,保持回调,并获得On成功的结果。 这是带有回调的适配器: 这是问题产生的远程数据源: API响应:

  • 我有两个java对象:MyObject和MyObjectDetails 搜索空值或空字符串的最佳且简单的方法是什么? 实际上,我正在为这个类使用一个特定的验证器,逐字段检查空值和空字符串。 例如,要检查空值,我使用: 但我也很喜欢将来可以用来制作其他物体的东西。

  • 我正在尝试使用适配器运行我的应用程序,但在执行此操作时,我遇到了以下错误: ReviewActivity StandupPlayerMain.java

  • 有人能给我解释一下原因吗?

  • 每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1

  • 我在使用recycler视图启动活动时出错,因此我有3个文件java类、一个适配器和要执行的活动。 java类只是一个具有3个变量的简单对象 回收器视图的适配器 以及活动 我得到的错误是: 我在一个空项目上做了同样的配置,一切看起来都是正确的,