RecycleView搜索過濾器-getFilter()
記錄一下,最近做項目,有一個需求,在列表中需要監聽輸入數據來過濾列表
Android 提供了Fileterable類,可以通過過濾器來過濾數據。通常,getFilter()方法必須在提供過濾條件的適配器類中被重寫,以通過列表進行搜索。下面是通過getFilter(),來過濾數據。
完整Adapter代碼:
public class BuildingAdapter extends RecyclerView.Adapter<BuildingAdapter.BuildingHolder> implements Filterable {
private List<String> mSourceList = new ArrayList<>();
private List<String> mFilterList = new ArrayList<>();
private Context mContext;
private OnItemClickListener mListener;
public BuildingAdapter(Context context, List<String> list) {
this.mContext = context;
this.mSourceList = list;
//這裏需要初始化filterList
mFilterList = list;
}
public void setListener(OnItemClickListener listener) {
this.mListener = listener;
}
@NonNull
@Override
public BuildingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new BuildingHolder(LayoutInflater.from(mContext).inflate(R.layout.item_building, parent, false));
}
@Override
public void onBindViewHolder(BuildingHolder holder, int position) {
holder.tvType.setText(mContext.getString(R.string.building));
holder.tvType.setBackgroundResource(R.drawable.bg_building);
//這裏也是過濾後的list
holder.tvName.setText(mFilterList.get(position));
}
@Override
public int getItemCount() {
//注意這裏需要是過濾後的list
return mFilterList.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String filter = charSequence.toString();
if (TextUtils.isEmpty(filter)) {
//沒有過濾的內容,則使用源數據
mFilterList = mSourceList;
} else {
filter = filter.toUpperCase();//小寫變大寫,是大寫的不變
List<String> filteredList = new ArrayList<>();
for (String str : mSourceList) {
//這裏根據需求,添加匹配規則
if (str.contains(filter)) {
filteredList.add(str);
}
}
mFilterList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilterList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilterList = (ArrayList<String>) filterResults.values;
notifyDataSetChanged();
}
};
}
class BuildingHolder extends RecyclerView.ViewHolder {
TextView tvType, tvName;
public BuildingHolder(@NonNull View itemView) {
super(itemView);
tvType = itemView.findViewById(R.id.tv_type);
tvName = itemView.findViewById(R.id.tv_name);
itemView.setOnClickListener(view -> {
if (mListener != null) {
mListener.onItemClick(getAdapterPosition());
}
});
}
}
public interface OnItemClickListener {
void onItemClick(int position);
}
}
設置EditText監聽,並監聽軟鍵盤搜索按鈕
etSearch.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
mAdapter.getFilter().filter(charSequence.toString());
}
@Override
public void afterTextChanged(Editable editable) {
}
});
etSearch.setOnEditorActionListener((textView, actionId, event) -> {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
hideInput();
mAdapter.getFilter().filter(etSearch.getText().toString());
return true;
}
return false;
});
結束!