package com.lapism.searchview; import android.content.Context; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.text.Spannable; import android.text.TextUtils; import android.text.style.ForegroundColorSpan; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Filter; import android.widget.Filterable; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; import java.util.Locale; public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ResultViewHolder> implements Filterable { private OnItemClickListener mItemClickListener; private List<SearchItem> mSearchList = new ArrayList<>(); private List<SearchItem> typeAheadData = new ArrayList<>(); private final List<Integer> startList = new ArrayList<>(); private final Context mContext; private int keyLength = 0; private final int theme; public SearchAdapter(Context mContext, List<SearchItem> mSearchList, List<SearchItem> typeAheadData, int theme) { this.mContext = mContext; this.mSearchList = mSearchList; this.typeAheadData = typeAheadData; this.theme = theme; } @Override public int getItemViewType(int position) { return position; } @Override public Filter getFilter() { return new Filter() { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults filterResults = new FilterResults(); if (!TextUtils.isEmpty(constraint)) { List<SearchItem> searchData = new ArrayList<>(); startList.clear(); String key = constraint.toString().toLowerCase(Locale.getDefault()); for (SearchItem str : typeAheadData) { String string = str.get_text().toString().toLowerCase(Locale.getDefault()); if (string.contains(key)) { searchData.add(str); startList.add(string.indexOf(key)); keyLength = key.length(); } } filterResults.values = searchData; filterResults.count = searchData.size(); } return filterResults; } @Override protected void publishResults(CharSequence constraint, FilterResults results) { if (results.values != null) { mSearchList.clear(); List<?> result = (List<?>) results.values; for (Object object : result) { if (object instanceof SearchItem) { mSearchList.add((SearchItem) object); } } notifyDataSetChanged(); } } }; } @Override public ResultViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) { final LayoutInflater mInflater = LayoutInflater.from(parent.getContext()); final View sView = mInflater.inflate(R.layout.search_view_item, parent, false); return new ResultViewHolder(sView); } @Override public void onBindViewHolder(ResultViewHolder viewHolder, int position) { SearchItem item = mSearchList.get(position); int start = startList.get(position); int end = start + keyLength; viewHolder.icon.setImageResource(item.get_icon()); if (theme == 0) { viewHolder.icon.setColorFilter(ContextCompat.getColor(mContext, R.color.search_light_icon)); viewHolder.text.setTextColor(ContextCompat.getColor(mContext, R.color.search_light_text)); viewHolder.text.setText(item.get_text(), TextView.BufferType.SPANNABLE); Spannable s = (Spannable) viewHolder.text.getText(); s.setSpan(new ForegroundColorSpan(ContextCompat.getColor(mContext, R.color.search_light_text_highlight)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } if (theme == 1) { viewHolder.icon.setColorFilter(ContextCompat.getColor(mContext, R.color.search_dark_icon)); viewHolder.text.setTextColor(ContextCompat.getColor(mContext, R.color.search_dark_text)); viewHolder.text.setText(item.get_text(), TextView.BufferType.SPANNABLE); Spannable s = (Spannable) viewHolder.text.getText(); s.setSpan(new ForegroundColorSpan(ContextCompat.getColor(mContext, R.color.search_dark_text_highlight)), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } @Override public int getItemCount() { return mSearchList.size(); } public interface OnItemClickListener { void onItemClick(View view, int position); } public void setOnItemClickListener(final OnItemClickListener mItemClickListener) { this.mItemClickListener = mItemClickListener; } public class ResultViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public final ImageView icon; public final TextView text; public ResultViewHolder(View view) { super(view); icon = (ImageView) view.findViewById(R.id.imageView_result); text = (TextView) view.findViewById(R.id.textView_result); view.setOnClickListener(this); } @Override public void onClick(View v) { if (mItemClickListener != null) { mItemClickListener.onItemClick(v, getLayoutPosition()); //getAdapterPosition() } } } }