Skip to content

Instantly share code, notes, and snippets.

@piyush-malaviya
Last active September 1, 2022 07:43
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save piyush-malaviya/db29b921d8c91ac3901dfbbd2578debd to your computer and use it in GitHub Desktop.
Save piyush-malaviya/db29b921d8c91ac3901dfbbd2578debd to your computer and use it in GitHub Desktop.
Filterable RecyclerView adapter
import android.os.Handler;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.widget.Filter;
import android.widget.Filterable;
import java.util.ArrayList;
public abstract class BaseFilterAdapter<T, S extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<S> implements Filterable {
private ArrayList<T> mOriginalArrayList = new ArrayList<>();
private ArrayList<T> mArrayList = new ArrayList<>();
private RecyclerView recyclerView;
public void setDataArrayList(ArrayList<T> mArrayList) {
this.mArrayList = mArrayList;
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView = recyclerView;
}
public void addItem(T object) {
mOriginalArrayList.add(object);
notifyDataSetChanged();
}
public void setItems(ArrayList<T> arrayList) {
this.mOriginalArrayList.clear();
this.mOriginalArrayList.addAll(arrayList);
this.mArrayList.clear();
this.mArrayList.addAll(arrayList);
notifyDataSetChanged();
}
public void addItems(ArrayList<T> arrayList) {
this.mOriginalArrayList.addAll(arrayList);
this.mArrayList.addAll(arrayList);
notifyDataSetChanged();
}
public ArrayList<T> getOriginalArrayList() {
return mOriginalArrayList;
}
public ArrayList<T> getList() {
return mArrayList;
}
public T getListItem(int position) {
if (position > mArrayList.size()) {
return null;
}
return mArrayList.get(position);
}
@Override
public int getItemCount() {
return mArrayList.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
mArrayList.clear();
if (TextUtils.isEmpty(charSequence)) {
mArrayList.addAll(mOriginalArrayList);
} else {
ArrayList<T> filteredList = new ArrayList<>();
for (T object : mOriginalArrayList) {
filterObject(filteredList, object, charSequence.toString());
}
mArrayList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mArrayList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
//noinspection unchecked
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
if (recyclerView != null) {
recyclerView.getRecycledViewPool().clear();
}
notifyDataSetChanged();
}
}, 100);
}
};
}
protected abstract void filterObject(ArrayList<T> filteredList, T object, String searchText);
}
import android.os.Handler;
import android.text.Editable;
import android.text.TextWatcher;
public abstract class DelayTextWatcher implements TextWatcher {
private final long DELAY = 300; // milliseconds
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
@Override
public void run() {
onAfterTextChanged();
}
};
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
handler.removeCallbacks(runnable);
handler.postDelayed(runnable, DELAY);
}
protected abstract void onAfterTextChanged();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment