Issue
I am working on an application where I have filtered my data from firestore but it is not working please guide me on where I am mistaking the code. it is neither showing any error or exception i have no idea where it is going wrong??
code for the filtering data in my recyclerview
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence keyword) {
ArrayList<RecyclerviewModel> filteredData = new ArrayList<>();
if (keyword.toString().isEmpty())
{
filteredData.addAll(backup);
}else {
firebaseFirestore.collection("users").whereEqualTo("search", keyword.toString().toLowerCase()).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>()
{
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots)
{
datalist.clear();
if (!queryDocumentSnapshots.isEmpty()) {
for (RecyclerviewModel obj : backup) {
if (obj.getName().toString().toLowerCase().contains(keyword.toString().toLowerCase())) {
filteredData.add(obj);
}
}
}else
{
Toast.makeText(context, "data not exist", Toast.LENGTH_SHORT);
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
FilterResults results = new FilterResults();
results.values = filteredData;
results.count = filteredData.size();
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
datalist.clear();
datalist.addAll((ArrayList<RecyclerviewModel>)filterResults.values);
notifyDataSetChanged();
}
};
return filter;
}
CODE FOR THE SEARCHVIEW IN MAINACTIVITY
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
recyclerviewAdapter.getFilter().filter(newText);
return false;
}
});
THE ERROR IT IS THROWING
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.example.sharedviewmodelapp.RecyclerviewAdapter$2.publishResults(RecyclerviewAdapter.java:239)
IT IS THWRING ERROR ON THE publishResults method line
datalist.addAll((ArrayList<RecyclerviewModel>)filterResults.values);
CODE FOR RECYCLLRVIEW ADAPTER
ArrayList<RecyclerviewModel> datalist;
ArrayList<RecyclerviewModel> backup;
Context context;
public RecyclerviewAdapter(ArrayList<RecyclerviewModel> datalist, Context context, HomeFragment homeFragment) {
this.datalist = datalist;
this.context = context;
this.homeFragment = homeFragment;
backup = new ArrayList<>(datalist);
}
Solution
Try this
CODE FOR THE SEARCHVIEW IN MAINACTIVITY
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
filterData();
return false;
}
});
private void filterData() {
ArrayList < RecyclerviewModel > filteredData = new ArrayList < > ();
for (RecyclerviewModel obj: userList) {
if (obj.getName().toString().toLowerCase().contains(keyword.toString().toLowerCase())) {
filteredData.add(obj);
}
}
recyclerviewAdapter.filterList(filteredData);
}
In Adaptor class
public void filterList(ArrayList < RecyclerviewModel > filteredData) {
datalist = filteredData;
notifyDataSetChanged();
}
Answered By - Aditya Nandardhane
Answer Checked By - Robin (JavaFixing Admin)