我试图在Fragment中实现一个带有建议(过滤器)的SearchView,但是我没有成功。我尝试了几乎所有的教程,但没有一个对我有效。我将感激任何帮助。谢谢你
可扩展置标语言...
<!--appBar layout-->
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize">
<!--searchView layout-->
<android.support.v7.widget.SearchView
android:id="@+id/search_view"
app:layout_scrollFlags="scroll|enterAlways"
android:iconifiedByDefault="false"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:closeIcon="@drawable/ic_clear_white_18dp"
app:searchIcon="@drawable/ic_search_white_24dp"
app:queryHint="@string/search_contact"
app:iconifiedByDefault="false"
android:background="@color/colorPrimary"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
</android.support.design.widget.AppBarLayout>
<!-- recycler view-->
<android.support.v7.widget.RecyclerView
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
碎片
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_contact_list, container, false);
searchView = (SearchView)view.findViewById(R.id.search_view);
fabButton = (FloatingActionButton)view.findViewById(R.id.fab_button);
//recycler view
recyclerView = (RecyclerView)view.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
contacts = SugarRecord.listAll(Contact.class);
contactsAdapter = new ContactsAdapter(getActivity(), contacts);
recyclerView.setAdapter(contactsAdapter);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
// TODO: setFilter
return true;
}
});
return view;
适配器
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ContactVH> {
List<Contact> mContact;
List<Contact> mContactFilter;
Context mContext;
public ContactsAdapter(Context context, List<Contact> contact) {
this.mContact = contact;
this.mContext = context;
}
@Override
public ContactVH onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_contact, parent, false);
ContactVH viewHolder = new ContactVH(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ContactVH holder, int position) {
holder.name.setText(mContact.get(position).getName());
}
@Override
public int getItemCount() {
return mContact.size();
}
class ContactVH extends RecyclerView.ViewHolder {
@BindView(R.id.contact_name)
TextView name;
public ContactVH(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
试试这个
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main_menu, menu);
MenuItem mSearchMenuItem = menu.findItem(R.id.search);
SearchView searchView = (SearchView) mSearchMenuItem.getActionView();
search(searchView);
}
public static void search(android.support.v7.widget.SearchView searchView) {
searchView.setOnQueryTextListener(new android.support.v7.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mCategoryAdapter.getFilter().filter(newText);
return true;
}
});
}
实现可过滤到适配器类
公共类CategoryAdapter扩展RecyclerView。适配器实现可过滤的{
private List<Category> categoryList;
private List<Category> mFilteredList;
public CategoryAdapter(List<Category> categoryList) {
this.categoryList = categoryList;
this.mFilteredList = categoryList;
}
@Override
public CategoryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.category_card, parent, false);
return new CategoryViewHolder(itemView);
}
@Override
public void onBindViewHolder(CategoryViewHolder holder, int position) {
Category category = mFilteredList.get(position);
holder.catname.setText(category.getCatName());
holder.items.setText(category.getCatItems()+" Items");
}
@Override
public int getItemCount() {
return mFilteredList.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mFilteredList = categoryList;
} else {
List<Category> filteredList = new ArrayList<>();
for (Category category : categoryList) {
if (category.getCatName().toLowerCase().contains(charString) || String.valueOf(category.getId()).contains(charString)) {
filteredList.add(category);
}
}
mFilteredList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilteredList = (List<Category>) filterResults.values;
notifyDataSetChanged();
}
};
}
public class CategoryViewHolder extends RecyclerView.ViewHolder {
public TextView catname, items;
public ImageView imgView;
public CategoryViewHolder(View view) {
super(view);
catname = view.findViewById(R.id.categorycard_cate_name);
items = view.findViewById(R.id.categorycard_lbl_cat_items);
}
}
public void removeItem(int position) {
mFilteredList.remove(position);
// notify the item removed by position
// to perform recycler view delete animations
// NOTE: don't call notifyDataSetChanged()
notifyItemRemoved(position);
}
public void restoreItem(Category category, int position) {
mFilteredList.add(position, category);
// notify item added by position
notifyItemInserted(position);
}
}
在适配器类中实现filterable并覆盖它的方法。
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
FilterResults filterResults = new FilterResults();
if(charSequence == null | charSequence.length() == 0){
filterResults.count = getUserModelListFiltered.size();
filterResults.values = getUserModelListFiltered;
}else{
String searchChr = charSequence.toString().toLowerCase();
List<UserModel> resultData = new ArrayList<>();
for(UserModel userModel: getUserModelListFiltered){
if(userModel.getUserName().toLowerCase().contains(searchChr)){
resultData.add(userModel);
}
}
filterResults.count = resultData.size();
filterResults.values = resultData;
}
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
userModelList = (List<UserModel>) filterResults.values;
notifyDataSetChanged();
}
};
return filter;
}
在您的主要活动中创建搜索视图并收听onQueryTextChange。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu, menu);
MenuItem menuItem = menu.findItem(R.id.search_view);
SearchView searchView = (SearchView) menuItem.getActionView();
searchView.setMaxWidth(Integer.MAX_VALUE);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
usersAdapter.getFilter().filter(newText);
return true;
}
});
return true;
}
完整的教程和源代码。带有搜索/过滤器的Recyclerview
您可以创建扩展Filter的类
class YourFilterClass extends Filter {
private List<Contact> contactList;
private List<Contact> filteredContactList;
private ContactsAdapter adapter;
public YourFilterClass(List<Contact> contactList, ContactsAdapter adapter) {
this.adapter = adapter;
this.contactList = contactList;
this.filteredContactList = new ArrayList();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
filteredContactList.clear();
final FilterResults results = new FilterResults();
//here you need to add proper items do filteredContactList
for (final Contact item : contactList) {
if (item.getName().toLowerCase().trim().contains("pattern")) {
filteredContactList.add(item);
}
}
results.values = filteredContactList;
results.count = filteredContactList.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
adapter.setList(filteredContactList);
adapter.notifyDataSetChanged();
}
}
然后你可以将此过滤器添加到您的联系人适配器。
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ContactVH> {
List<Contact> mContact;
List<Contact> mContactFilter;
YourFilterClass filter;
Context mContext;
public ContactsAdapter(Context context, List<Contact> contact) {
this.mContact = contact;
this.mContactFilter = contact;
this.mContext = context;
filter = new YourFilterClass(mContact, this);
}
@Override
public ContactVH onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item_contact, parent, false);
ContactVH viewHolder = new ContactVH(view);
return viewHolder;
}
@Override
public void onBindViewHolder(ContactVH holder, int position) {
holder.name.setText(mContactFilter.get(position).getName());
}
// set adapter filtered list
public void setList(List<Contact> list) {
this.mContactFilter = list;
}
//call when you want to filter
public void filterList(String text) {
filter.filter(text);
}
@Override
public int getItemCount() {
return mContactFilter.size();
}
class ContactVH extends RecyclerView.ViewHolder {
@BindView(R.id.contact_name)
TextView name;
public ContactVH(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
}
}
我使用SearchView过滤我的应用程序的RecyclerView,就像这篇文章中描述的一样: 如何使用SearchView筛选RecyclerView 一开始一切看起来都很好,我可以根据需要过滤RecyclerView,但是经过一些尝试,出现了两个问题: 如果我在SearchView中输入文本太快,应用程序会崩溃,并出现以下日志: E/AndroidRuntime: FATAL EXCEPTI
Android通用搜索功能似乎有很好的系统支持,除了语音搜索之外,还可以显示搜索建议,如最近的查询建议和自定义建议。 此框架要求声明搜索活动。该活动以意向获取查询,并将搜索结果呈现给列表视图。 我对此有两个问题: 1-我想在当前活动中进行搜索(我在应用程序栏上有一个搜索视图)。那么,该活动是否会重新启动?那会很奇怪。我应该发送到不可见的活动并获取结果吗?这可能吗? 2-我可以使用RecyclerV
带有可筛选得适配器: filter由于某种原因不起作用,当我键入某些内容时,它会清除recyclerview
Navicat 提供筛选功能,让你在连接窗格、对象列表窗格、模型设计器和其他树状结构搜索对象。 在连接窗格或其他树状结构,点击该窗格或树来聚焦并直接筛选字符串。如果连接窗格中的连接已打开,筛选也会同时应用到连接中的数据库对象。 在对象列表窗格,点击 Navicat 主窗口的 ,并在搜索框里输入筛选字符串。在模型设计窗口,简单地在搜索框里输入筛选字符串。 你可以移除筛选,只需删除筛选字符串。
“对象筛选”能让你在 Navicat Cloud 筛选模型,在视图设计器中筛选树状结构、以及在画布中筛选包含筛选字符串的表、实体或视图。 只需在“搜索”文本框中指定一个筛选字符串。若要移除筛选,只需删除筛选字符串。
“对象筛选”能让你在 Navicat Cloud 筛选模型,以及在画布中筛选包含筛选字符串的表、实体或视图。 只需在“搜索”文本框中指定一个筛选字符串。若要移除筛选,只需删除筛选字符串。 “树筛选”能让你在浏览器或檢视图设计器中筛选包含筛选字符串的树状结构。 点击树来聚焦并直接指定筛选字符串。若要移除筛选,只需删除筛选字符串。