I've been trying to add SearchView to my RecyclerView for some time and have referenced these posts here, here and here. At this point, I'm sure the answer is staring me right in the face.
However, I'm not sure how to implement the SearchView when for example, using the following:
private static final List<DataModel> getDummyData(){
List<DataModel> dummyDataList = new ArrayList<>();
dummyDataList.add(new DataModel("Alphabet", "Sub Alphabet"));
dummyDataList.add(new DataModel("Banana", "Sub Banana"));
dummyDataList.add(new DataModel("Captain", "Sub Captain"));
dummyDataList.add(new DataModel("Donut", "Sub Donut"));
dummyDataList.add(new DataModel("Elephant", "Sub Elephant"));
dummyDataList.add(new DataModel("Fox", "Sub Fox"));
dummyDataList.add(new DataModel("Giraffe", "Sub Giraffe"));
dummyDataList.add(new DataModel("Hippo", "Sub Hippo"));
dummyDataList.add(new DataModel("Iguana", "Sub Iguana"));
dummyDataList.add(new DataModel("Jumanji", "Sub Jumanji"));
return dummyDataList;
}
Here's my current setup (following this tutorial) which uses Locale.getISOCountries(); and searches through the names of countries.
MainActivityFragment:
public class MainActivityFragment extends Fragment implements SearchView.OnQueryTextListener {
private RecyclerView mRecyclerView;
private List<DataModel> mDataModel;
private RVAdapter adapter;
public MainActivityFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_one_fragment, container, false);
mRecyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(layoutManager);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setHasOptionsMenu(true);
String[] locales = Locale.getISOCountries();
mDataModel = new ArrayList<>();
for (String countryCode : locales){
Locale obj = new Locale("", countryCode);
mDataModel.add(new DataModel(obj.getDisplayCountry(), obj.getISO3Country()));
}
adapter = new RVAdapter(mDataModel);
mRecyclerView.setAdapter(adapter);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_main, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
MenuItemCompat.setOnActionExpandListener(item,
new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
// Do something when collapsed
adapter.setFilter(mDataModel);
return true;
}
});
}
@Override
public boolean onQueryTextChange(String newText) {
final List<DataModel> filteredModeList = filter(mDataModel, newText);
adapter.setFilter(filteredModeList);
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
private List<DataModel>filter(List<DataModel> models, String query){
query = query.toLowerCase();
final List<DataModel> filteredModeList = new ArrayList<>();
for (DataModel model : models){
final String text = model.getName().toLowerCase();
if (text.contains(query)){
filteredModeList.add(model);
}
}
return filteredModeList;
}
}
And my Adapter-RVAdapter.java:
public class RVAdapter extends RecyclerView.Adapter<ItemViewHolder> {
private List<DataModel> mDataModel;
public RVAdapter(List<DataModel> mDataModel){
this.mDataModel = mDataModel;
}
@Override
public void onBindViewHolder(ItemViewHolder itemViewHolder, int position) {
final DataModel model = mDataModel.get(position);
itemViewHolder.bind(model);
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int position){
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, viewGroup, false);
return new ItemViewHolder(view);
}
@Override
public int getItemCount() {
return mDataModel.size();
}
public void setFilter(List<DataModel> dataModels){
mDataModel = new ArrayList<>();
mDataModel.addAll(dataModels);
notifyDataSetChanged();
}
}
Here's the ItemViewHolder.java:
public class ItemViewHolder extends RecyclerView.ViewHolder {
public TextView name_TextView;
public TextView subName_TextView;
public ItemViewHolder(View itemView){
super(itemView);
name_TextView = (TextView)itemView.findViewById(R.id.country_name);
subName_TextView = (TextView)itemView.findViewById(R.id.country_iso);
}
public void bind(DataModel dataModel){
name_TextView.setText(dataModel.getName());
subName_TextView.setText(dataModel.getSubName());
}
}
And finally, DataModel.java:
public class DataModel {
String name;
String subName;
DataModel(String name, String subName){
this.name = name;
this.subName = subName;
}
public String getName(){
return name;
}
public String getSubName(){
return subName;
}
}
Any help, suggestions or a point in the right direction would be awesome!