搜索适配器-';java.lang.Object[]java.util.Collection.toArray()';关于空对象引用
我做了一个SearchAdapter,可以实时过滤项目,但是有NPE,我不知道该怎么做。。。 它有时会工作,但会产生NPE并关闭应用程序 这些是我创建这个适配器所遵循的链接- 下面是适配器代码和错误日志搜索适配器-';java.lang.Object[]java.util.Collection.toArray()';关于空对象引用,java,android,android-studio,adapter,android-filterable,Java,Android,Android Studio,Adapter,Android Filterable,我做了一个SearchAdapter,可以实时过滤项目,但是有NPE,我不知道该怎么做。。。 它有时会工作,但会产生NPE并关闭应用程序 这些是我创建这个适配器所遵循的链接- 下面是适配器代码和错误日志 public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.SearchViewHolder> implements Filterable { private ArrayList<SearchI
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();
}
};
}
您的
结果。值
可能为空,或者它可能包含其他对象,而不是搜索项
。您应该更加谨慎,以防止此类错误
试着这样做:
@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();
}
@覆盖
受保护的void publishResults(CharSequence约束、FilterResults结果)
{
searchList.clear();
if(results.values实例列表){
对于(对象项:(列表)results.values){
if(SearchItem的项目实例){
searchList.add((SearchItem)项);
}
}
}
notifyDataSetChanged();
}
前面的performFiltering()
中可能会引发另一个异常。在日志中进一步查找另一个堆栈跟踪。@Mike.M。现在我检查了一下,performFiltering()抛出了异常,NPE抛出了“java.lang.String java.lang.String.toLowerCase()”是的,我就是这么想的。看起来item.getFolder()
和/或item.getPlace()
至少为一个项目返回null。如果允许的话,那么您需要先检查null,然后再对这些对象执行toLowerCase().contains()
。否则,如果这些值不应为null,则需要查看列表的生成位置,以了解如何得到具有null值的项目。@Mike.M如果没有您的帮助,Thank将无法找到实际原因。你是个救生员!
@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();
}