gpt4 book ai didi

android - 使用 RecyclerView 的 SearchView 过滤器

转载 作者:太空狗 更新时间:2023-10-29 16:13:12 24 4
gpt4 key购买 nike

我尝试在 Fragment 中实现带有建议(过滤器)的 SearchView,但我没有成功。我几乎尝试了所有教程,但对我没有任何帮助。我将不胜感激任何帮助。谢谢

XML...

    <!--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" />

fragment

@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);
}

}

}

最佳答案

您可以创建扩展 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();
}

然后您可以将此Filter 添加到您的ContactsAdapter

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);
}

}

关于android - 使用 RecyclerView 的 SearchView 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38098390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com