我做了一个实时过滤项目的搜索适配器,但是有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();
}
我正在尝试从API获取一些数据,由于我将此回调指向空响应,因此出现以下错误: 如何在保持功能的同时修复它?这意味着,保持回调,并获得On成功的结果。 这是带有回调的适配器: 这是问题产生的远程数据源: API响应:
我有两个java对象:MyObject和MyObjectDetails 搜索空值或空字符串的最佳且简单的方法是什么? 实际上,我正在为这个类使用一个特定的验证器,逐字段检查空值和空字符串。 例如,要检查空值,我使用: 但我也很喜欢将来可以用来制作其他物体的东西。
我正在尝试使用适配器运行我的应用程序,但在执行此操作时,我遇到了以下错误: ReviewActivity StandupPlayerMain.java
有人能给我解释一下原因吗?
每个java开发人员都知道,java对象不再使用时将被垃圾收集。我想知道JVM如何识别必须为垃圾收集选择的对象。(例如,如果我有10个对象。如果对10个对象中的2个进行垃圾收集,jvm将如何找到这两个对象)。 JVM使用标记和扫描算法(如果我是对的)。 1)例如我在下面提供字符串对象场景 //现在s1
我在使用recycler视图启动活动时出错,因此我有3个文件java类、一个适配器和要执行的活动。 java类只是一个具有3个变量的简单对象 回收器视图的适配器 以及活动 我得到的错误是: 我在一个空项目上做了同样的配置,一切看起来都是正确的,