I made a SearchAdapter that filters items in realtime, but there is NPE and I have no clue what to do... It works sometimes but gives NPE and shutdowns the application.
These are the links that I have followed to make this adapter - https://codinginflow.com/tutorials/android/searchview-recyclerview https://www.youtube.com/watch?v=ujKDN_ZtGHQ
And Here are adapter codes and error logs.
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();
}
};
}
ERROR LOG ----------------------------------------------------------------------------
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)
Your
results.values
might be null, or it may contain other objects instead ofSearchItem
's. You should be a little more cautious to prevent this kind of errors.Try something like this: