List View Filter Android
public class MyListAdapter extends BaseAdapter implements Filterable {
private List mData;
private List mFilteredData;
public MyListAdapter(List data) {
mData = data;
mFilteredData = data;
}
@Override
public Filter getFilter() {
return new MyFilter();
}
@Override
public int getCount() {
return mFilteredData.size();
}
@Override
public Object getItem(int position) {
return mFilteredData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Inflate the view and bind data to it
...
return view;
}
private class MyFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String query = constraint.toString().toLowerCase();
FilterResults results = new FilterResults();
List filteredList = new ArrayList<>();
for (MyItem item : mData) {
if (item.getName().toLowerCase().contains(query)) {
filteredList.add(item);
}
}
results.count = filteredList.size();
results.values = filteredList;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mFilteredData = (List) results.values;
notifyDataSetChanged();
}
}
}
public class MyActivity extends AppCompatActivity {
private ListView mListView;
private MyListAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Set up the ListView and adapter
mListView = findViewById(R.id.list_view);
mAdapter = new MyListAdapter(getData());
mListView.setAdapter(mAdapter);
// Set up the search view widget
SearchView searchView = findViewById(R.id.search_view);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mAdapter.getFilter().filter(newText);
return true;
}
});