How to change color, or highlight the search word when using SearchView in filtered RecyclerView?

MainActivity

public class Chapter1 extends AppCompatActivity implements SearchView.OnQueryTextListener { MyRecAdapter myRecAdapter; RecyclerView recyclerView; List<Post> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(layout.chapter1_main); recyclerView = (RecyclerView) findViewById(R.id.myrec); createdata(); myRecAdapter = new MyRecAdapter(list, Chapter1.this); recyclerView.setLayoutManager(new LinearLayoutManager(Chapter1.this)); recyclerView.setAdapter(myRecAdapter); } void createdata() { list = new ArrayList<>(); String topic_1_1 = getResources().getString(string.topic_1_1); String text_1_1 = getString(string.text_1_1); String topic_1_2 = getResources().getString(string.topic_1_2); String topic_1_3 = getResources().getString(string.topic_1_3); String text_1_3 = getString(string.text_1_3); list.add(new Post(topic_1_1, text_1_1)); list.add(new Post(topic_1_2, "")); list.add(new Post(topic_1_3, text_1_3)); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_search, menu); getMenuInflater().inflate(R.menu.main, menu); MenuItem item = menu.findItem(R.id.menu_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(item); searchView.setOnQueryTextListener(this); return super.onCreateOptionsMenu(menu); } @Override public boolean onQueryTextChange(String newText) { final List<Post> filteredModelList = filter(list, newText); if (filteredModelList.size() > 0) { myRecAdapter.setFilter(filteredModelList); return true; } else { Toast.makeText(Chapter1.this, "Not Found", Toast.LENGTH_SHORT).show(); return false; } } private List<Post> filter(List<Post> models, String query ) { query = query.toLowerCase(); final List<Post> filteredModelList = new ArrayList<>(); for (Post model : models) { final String text = model.getPostTitle().toLowerCase(); final String text_sub = model.getPostSubTitle().toLowerCase(); if (text.contains(query)) { filteredModelList.add(model); } else { if (text_sub.contains(query)) { filteredModelList.add(model); } } } createdata(); myRecAdapter = new MyRecAdapter(filteredModelList, Chapter1.this); recyclerView.setLayoutManager(new LinearLayoutManager(Chapter1.this)); recyclerView.setAdapter(myRecAdapter); myRecAdapter.notifyDataSetChanged(); return filteredModelList; } } 

Adapter

 public class MyRecAdapter extends RecyclerView.Adapter<MyRecAdapter.VH> { public List<Post> parkingList; public Context context; ArrayList<Post> mCountryModel; public MyRecAdapter(List<Post> parkingList, Context context) { this.parkingList = parkingList; this.context = context; } @Override public MyRecAdapter.VH onCreateViewHolder(ViewGroup parent, int viewType) { return new MyRecAdapter.VH(LayoutInflater.from(parent.getContext()).inflate(R.layout.mycardview, parent, false)); } @Override public void onBindViewHolder(MyRecAdapter.VH holder, int position) { holder.t1.setText(Html.fromHtml(parkingList.get(position).getPostTitle())); holder.t2.setText(Html.fromHtml(parkingList.get(position).getPostSubTitle())); } @Override public int getItemCount() { return parkingList.size(); } public class VH extends RecyclerView.ViewHolder { TextView t1, t2; public VH(View view) { super(view); t1 = (TextView) view.findViewById(R.id.list_title); t2 = (TextView) view.findViewById(R.id.list_desc); } } public void setFilter(List<Post> countryModels) { mCountryModel = new ArrayList<>(); mCountryModel.addAll(countryModels); notifyDataSetChanged(); } } 

Post

 public class Post { private String postTitle; private String postSubTitle; public String getPostTitle() { return postTitle; } public void setPostTitle(String postTitle) { this.postTitle = postTitle; } public String getPostSubTitle() { return postSubTitle; } public void setPostSubTitle (String postSubTitle) { this.postSubTitle = postSubTitle; } public Post(String postTitle, String postSubTitle) { this.postTitle = postTitle; this.postSubTitle = postSubTitle; } 
  • The question is not clear, create and attach an image of what result you want to achieve - P. Ilyin
  • If you are given an exhaustive answer, mark it as correct (a daw opposite the selected answer). - Nicolas Chabanovsky

1 answer 1

Using Spannable

 String displayName = contact.getFullName(); int startIndex = indexOfSearchQuery(displayName); if (startIndex == -1) { holder.name.setText(displayName); } else { SpannableString highlightedName = new SpannableString(displayName); highlightedName.setSpan(new TextAppearanceSpan(context, R.style.searchTextHiglight), startIndex, startIndex + searchTerm.length(), 0); holder.name.setText(highlightedName); } 

The indexOfSearchQuery function:

 private int indexOfSearchQuery(String displayName) { if (!TextUtils.isEmpty(searchTerm)) { return displayName.toLowerCase(Locale.getDefault()).indexOf( searchTerm.toLowerCase(Locale.getDefault())); } return -1; } 

R.style.searchTextHighlight :

 <style name="searchTextHiglight"> <item name="android:textColor">@color/theme_accent_2</item> <item name="android:textStyle">bold</item> </style> 

PS Well, respectively, when searching, transfer searchTerm to the adapter + notifyDataSetChanged .

  • Thank !!!! Working !!!!!!!!!!!!!!!! :) - ivan