I implemented a search functionality in custom list view to my application. My problem is that I am getting this error (just on the real phones, not the virtuals):
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
I don’t understand why on virtual devices the search functionality works like a charm. Where does the problem lie? This is my code:
CustomAdapterShoppingList
class:
public class CustomAdapterShoppingList extends BaseAdapter implements Filterable {
List<Product> list;
List<Product> listFiltered;
Context mContext;
public CustomAdapterShoppingList(@NonNull Context context, List<Product> products) {
this.list = products;
this.listFiltered = products;
this.mContext = context;
}
@Override
public int getCount() {
return listFiltered.size(); <---- THE ERROR mentioned above
}
@Override
public Product getItem(int position) {
return listFiltered.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
private int lastPosition = -1;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.shoplist_row, parent,
false);
}
Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition)
? R.anim.up_from_bottom : R.anim.down_from_top);
convertView.startAnimation(animation);
lastPosition = position;
TextView number = convertView.findViewById(R.id.number);
number.setText(position + 1 + ".");
TextView name = convertView.findViewById(R.id.name);
name.setText(listFiltered.get(position).getProduktName());
return convertView;
}
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults filterResults = new FilterResults();
if (list == null) {
list = new ArrayList<>(listFiltered);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
if (charSequence == null || charSequence.isEmpty()) {
filterResults.count = list.size();
filterResults.values = list;
} else {
List<Product> resultPrd = new ArrayList<>();
String searchStr = charSequence.toString().toLowerCase();
for (Product prd:list) {
if(prd.getProduktName().contains(searchStr)) {
resultPrd.add(prd);
}
filterResults.count = resultPrd.size();
filterResults.values = resultPrd;
}
}
}
return filterResults;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
listFiltered = (List<Product>) filterResults.values;
notifyDataSetChanged();
}
};
return filter;
}
}
Then, calling The search functionality in ShoppinglistActivity
class with this code:
adapter = new CustomAdapterShoppingList(getApplicationContext(), products);
shoppingList.setAdapter(adapter);
adapter.notifyDataSetChanged();
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});