getFilter() 的问题:java.lang.NullPointerException

Posted

技术标签:

【中文标题】getFilter() 的问题:java.lang.NullPointerException【英文标题】:Problems with getFilter(): java.lang.NullPointerException 【发布时间】:2020-10-28 20:22:52 【问题描述】:

我的 getFilter() 有问题,当我在 Activity 上填充 RecyclerView 时一切正常,但是当我开始在 SearchView 上输入时出现此错误:

java.lang.NullPointerException:尝试调用虚拟方法 'package.Classes.Farm.getFarms()' 在空对象引用上

为什么当我填充我的 RecyclerView 不为空(Farm.class)之前,当我开始输入搜索时,为空?

在活动中,我在回调响应和填充 RecyclerView 之后启动我的 setOnQueryTextListener。我用同样的代码几个月了,从来没有遇到过问题,现在他们改变了响应回调并且发生了这个错误(之前(响应示例):https://jsonplaceholder.typicode.com/posts,getFilter() 就像一个魅力一样工作)。

(如果您需要更多代码和详细信息,请告诉我,我会编辑我的问题。我的英语生疏了)

响应 OkHttp:


  "farms": [
    
      "id": "000000000-0000-0000-0000-000000000000",
      "name": "Areado"
    
  ]

生成的第一个类:

public class Farm 

@SerializedName("farms")
@Expose
private List<Farm_> farms = null;

public List<Farm_> getFarms() 
return farms;


public void setFarms(List<Farm_> farms) 
this.farms = farms;



生成的第二个类:

public class Farm_ 

@SerializedName("id")
@Expose
private String id;
@SerializedName("name")
@Expose
private String name;

public String getId() 
return id;


public void setId(String id) 
this.id = id;


public String getName() 
return name;


public void setName(String name) 
this.name = name;



来自适配器的 getFilter() 方法(farmListFiltred 和 farmList 来自 Farm.class 类型):

@Override
public Filter getFilter() 
    return new Filter() 
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) 
            String charString = charSequence.toString();
            if (charString.isEmpty()) 
                farmListFiltred = farmList;
             else 
                Farm filteredList;
                filteredList = new Farm();
                for (Farm_ row : farmList.getFarms()) 
                    if (row.getName().toLowerCase().contains(charString.toLowerCase())) 
                        filteredList.getFarms().add(row);
                    
                

                farmListFiltred = filteredList;
            

            FilterResults filterResults = new FilterResults();
            filterResults.values = farmListFiltred;
            return filterResults;
        

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) 
            farmListFiltred = (Farm) filterResults.values;
            notifyDataSetChanged();
        
    ;

【问题讨论】:

【参考方案1】:

在您的 Farm 类中,farms 成员变量最初设置为 null。它仅在调用 Farm 类的 setter 时获取值,而不是通过构造函数。因此调用filteredList.getFarms(),预计会产生一个nullPointer 异常。我建议只做类似的事情

private List<Farm_> farms = new List<Farm_>();

在您的 Farm 课程中。

【讨论】:

以上是关于getFilter() 的问题:java.lang.NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BaseAdapter 上实现 getFilter?

自定义 ArrayAdapter 上的 getFilter() 不起作用

Android listview 不能用 android 中的 getFilter() 更新

android中自定义ArrayAdapter中的自定义getFilter

如何使用 getFilter() 和 ListAdapter 过滤 ListView?

我的 getFilter() 方法有错误吗?