[英]searchview EditText with Recyclerview
I am trying to add search functionality in my recyclerview
. 我正在尝试在我的
recyclerview
添加搜索功能。 I found a tutorial on google and implemented the same. 我在Google上找到了一个教程并实现了相同的教程。 Search using editText in
recyclerview
. 在
recyclerview
使用editText进行搜索。 But my list disappears when I enter the input. 但是,当我输入输入内容时,我的列表就会消失。 Where am I going wrong?
我要去哪里错了? My recycler view contains multiple textboxes.
我的回收者视图包含多个文本框。 Below is
MyAdapter class
. 下面是
MyAdapter class
。
How do I implement search functionality with the below code? 如何使用以下代码实现搜索功能?
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>implements Filterable {
private List<ListItem> listItems;
private List<ListItem> mFilterData;
private Context context;
String m,e;
private ItemFilter mFilter = new ItemFilter();
public MyAdapter(List<ListItem> itemList, Context context) {
this.listItems = itemList;
this.context = context;
this.mFilterData = listItems;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ListItem listItem = mFilterData.get(position);
holder.nameText.setText(listItem.getName());
holder.addText.setText(listItem.getAddress());
Picasso.with(context).load(listItem.getLogo()).resize(180,80).into(holder.imageText);
}
@Override
public int getItemCount() {
return mFilterData.size();
}
public int getCount() {
return mFilterData.size();
}
public ListItem getItem(int position) {
return mFilterData.get(position);
}
public long getItemId(int position) {
return position;
}
@Override
public Filter getFilter() {
return mFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String userString = constraint.toString().toLowerCase();
FilterResults filterResults = new FilterResults();
final List<ListItem> originalList = listItems;
int count = originalList.size();
final ArrayList<ListItem> resultList = new ArrayList<>(count);
ListItem tDescription;
for (int i = 0; i < count; i++) {
tDescription= originalList.get(i);
if (tDescription.getName().toLowerCase().contains(userString)) {
resultList.add(tDescription);
}
}
filterResults.values = resultList;
filterResults.count = resultList.size();
return filterResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mFilterData = (ArrayList<ListItem>) results.values;
notifyDataSetChanged();
}
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView nameText, addText,mobText,emailText;
public ImageView imageText;
public ViewHolder(View itemView) {
super(itemView);
//code
}
}
}
SEARCH 搜索
private void addTextListener() {
search.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
s = s.toString().toLowerCase();
final List<ListItem> filteredList = new ArrayList<>();
for (int i = 0; i < listItems.size(); i++) {
final String text = listItems.get(i).toString();
if (text.contains(s)) {
filteredList.add(listItems.get(i));
}
}
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
adapter = new MyAdapter(filteredList, getActivity());
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged(); // data set changed
}
});
}
Try below code 试试下面的代码
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String userString = constraint.toString().toLowerCase();
if (userString.isEmpty()) {
mFilterData = listItems;
} else {
ArrayList<ListItem> resultList = new ArrayList<>();
for (ListItem mListItem : listItems) {
if (mListItem.getName().toLowerCase().contains(userString)) {
resultList.add(mListItem);
}
}
mFilterData = resultList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilterData;
filterResults.count = mFilterData.size();
return filterResults;
}
}
Updated 更新
Remove all code from edittext OnTextChange and write below code,no need to set adapter and all just write below oneline code and remove rest of code 从edittext OnTextChange删除所有代码并在下面编写代码,无需设置适配器,而仅在oneline代码下编写并删除其余代码
adapter.getFilter().filter(s.toString());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.