Android 带有RecyclerView的SearchView筛选器筛选结果错误
我有一个带有RecyclerView的SearchView,它打算搜索联系人列表。但搜索结果似乎是错误的。正在进行某些筛选,但不是正确的筛选。例如,如果我用字符“a”搜索,它将过滤掉一些随机的内容,而不是以a开头的联系人。代码片段如下 活动类Android 带有RecyclerView的SearchView筛选器筛选结果错误,android,android-recyclerview,searchview,android-filterable,Android,Android Recyclerview,Searchview,Android Filterable,我有一个带有RecyclerView的SearchView,它打算搜索联系人列表。但搜索结果似乎是错误的。正在进行某些筛选,但不是正确的筛选。例如,如果我用字符“a”搜索,它将过滤掉一些随机的内容,而不是以a开头的联系人。代码片段如下 活动类 public class MembersActivity extends AppCompatActivity implements SearchView.OnQueryTextListener { @BindView(R.id.meetup_me
public class MembersActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
@BindView(R.id.meetup_members_recycler_view)
RecyclerView mRecyclerView;
CustomContactAdapter contactAdapter;
List<Contact> contactList = new ArrayList();
private SearchView mSearchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meetup_members);
ButterKnife.bind(this);
mSearchView = (SearchView) findViewById(R.id.action_search);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
getAllContacts();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(this);
return true;
}
private void getAllContacts() {
Contact contact;
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
if (hasPhoneNumber > 0) {
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
contact = new Contact();
contact.setName(name);
Cursor phoneCursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{id},
null);
if (phoneCursor.moveToNext()) {
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contact.setMobile(phoneNumber);
}
phoneCursor.close();
contactList.add(contact);
}
}
contactAdapter = new CustomContactAdapter(getApplicationContext(),contactList);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(contactAdapter);
}
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
contactAdapter.getFilter().filter(newText);
return true;
}
}
public class CustomContactAdapter extends RecyclerView.Adapter<CustomContactAdapter.ContactViewHolder>
implements CompoundButton.OnCheckedChangeListener,Filterable {
Context mContext;
LayoutInflater mInflater;
private List<Contact> contactList = new ArrayList<Contact>();
private List<Contact> filterContactList = new ArrayList<Contact>();
private ContactFilter contactFilter;
public CustomContactAdapter(Context context,List<Contact> contacts)
{
mInflater = LayoutInflater.from(context);
mContext = context;
this.contactList = contacts;
this.filterContactList = contacts;
}
public static class ContactViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
@BindView(R.id.member_name)
TextView mContactName;
@BindView(R.id.member_mobile)
TextView mPhoneNumber;
@BindView(R.id.member_image)
ImageView mImage;
public ContactViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
view.setOnClickListener(this);
}
@Override
public void onClick(View view){
}
}
@Override
public CustomContactAdapter.ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.member_list_row, parent, false);
return new CustomContactAdapter.ContactViewHolder(itemView);
}
@Override
public void onBindViewHolder(CustomContactAdapter.ContactViewHolder holder, int position) {
Contact contact = contactList.get(position);
holder.mContactName.setText(contact.getName());
holder.mPhoneNumber.setText(contact.getMobile());
}
@Override
public int getItemCount() {
return filterContactList.size();
}
@Override
public Filter getFilter() {
if(contactFilter == null)
contactFilter = new ContactFilter();
return contactFilter;
}
private class ContactFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint!=null && constraint.length()>0) {
ArrayList<Contact> tempList = new ArrayList<Contact>();
for (Contact contact : contactList) {
if (contact.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
tempList.add(contact);
}
}
filterResults.count = tempList.size();
filterResults.values = tempList;
System.out.println("performFiltering:SearchFoundCount "+ tempList.size());
System.out.println("performFiltering:ActualSize "+ contactList.size());
} else {
filterResults.count = contactList.size();
filterResults.values = contactList;
}
return filterResults;
}
/**
* Notify about filtered list to ui
* @param constraint text
* @param results filtered result
*/
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filterContactList = (ArrayList<Contact>) results.values;
notifyDataSetChanged();
}
}
}
public class MembersActivity扩展AppCompativity实现SearchView.OnQueryTextListener{
@BindView(R.id.meetup\U成员\U回收者\U视图)
回收视图mRecyclerView;
CustomContactAdapter-contactAdapter;
List contactList=new ArrayList();
私有搜索视图;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u meetup\u成员);
把(这个)绑起来;
mSearchView=(SearchView)findViewById(R.id.action\u search);
mRecyclerView.setLayoutManager(新的LinearLayoutManager(this));
getAllContacts();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(右菜单菜单菜单主菜单);
final MenuItem searchItem=menu.findItem(R.id.action\u search);
最终SearchView SearchView=(SearchView)MenuItemCompat.getActionView(searchItem);
setOnQueryTextListener(这个);
返回true;
}
私有void getAllContacts(){
接触;
ContentResolver ContentResolver=getContentResolver();
Cursor Cursor=contentResolver.query(ContactsContract.Contacts.CONTENT\u URI,null,null,null,ContactsContract.commondatatypes.Phone.DISPLAY\u NAME+“ASC”);
if(cursor.getCount()>0){
while(cursor.moveToNext()){
int hasPhoneNumber=Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
如果(hasPhoneNumber>0){
String id=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.\u id));
字符串名称=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_name));
触点=新触点();
contact.setName(name);
Cursor phoneCursor=contentResolver.query(
ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,
无效的
ContactsContract.CommonDataTypes.Phone.CONTACT_ID+“=?”,
新字符串[]{id},
无效);
if(phoneCursor.moveToNext()){
String phoneNumber=phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
联系人:setMobile(电话号码);
}
phoneCursor.close();
联系人列表。添加(联系人);
}
}
contactAdapter=新的CustomContactAdapter(getApplicationContext(),contactList);
mRecyclerView.setLayoutManager(新的LinearLayoutManager(this));
mRecyclerView.setAdapter(contactAdapter);
}
}
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
contactAdapter.getFilter().filter(新文本);
返回true;
}
}
适配器类
public class MembersActivity extends AppCompatActivity implements SearchView.OnQueryTextListener {
@BindView(R.id.meetup_members_recycler_view)
RecyclerView mRecyclerView;
CustomContactAdapter contactAdapter;
List<Contact> contactList = new ArrayList();
private SearchView mSearchView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_meetup_members);
ButterKnife.bind(this);
mSearchView = (SearchView) findViewById(R.id.action_search);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
getAllContacts();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
final MenuItem searchItem = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextListener(this);
return true;
}
private void getAllContacts() {
Contact contact;
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
if (hasPhoneNumber > 0) {
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
contact = new Contact();
contact.setName(name);
Cursor phoneCursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{id},
null);
if (phoneCursor.moveToNext()) {
String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contact.setMobile(phoneNumber);
}
phoneCursor.close();
contactList.add(contact);
}
}
contactAdapter = new CustomContactAdapter(getApplicationContext(),contactList);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(contactAdapter);
}
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
contactAdapter.getFilter().filter(newText);
return true;
}
}
public class CustomContactAdapter extends RecyclerView.Adapter<CustomContactAdapter.ContactViewHolder>
implements CompoundButton.OnCheckedChangeListener,Filterable {
Context mContext;
LayoutInflater mInflater;
private List<Contact> contactList = new ArrayList<Contact>();
private List<Contact> filterContactList = new ArrayList<Contact>();
private ContactFilter contactFilter;
public CustomContactAdapter(Context context,List<Contact> contacts)
{
mInflater = LayoutInflater.from(context);
mContext = context;
this.contactList = contacts;
this.filterContactList = contacts;
}
public static class ContactViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
@BindView(R.id.member_name)
TextView mContactName;
@BindView(R.id.member_mobile)
TextView mPhoneNumber;
@BindView(R.id.member_image)
ImageView mImage;
public ContactViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
view.setOnClickListener(this);
}
@Override
public void onClick(View view){
}
}
@Override
public CustomContactAdapter.ContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.member_list_row, parent, false);
return new CustomContactAdapter.ContactViewHolder(itemView);
}
@Override
public void onBindViewHolder(CustomContactAdapter.ContactViewHolder holder, int position) {
Contact contact = contactList.get(position);
holder.mContactName.setText(contact.getName());
holder.mPhoneNumber.setText(contact.getMobile());
}
@Override
public int getItemCount() {
return filterContactList.size();
}
@Override
public Filter getFilter() {
if(contactFilter == null)
contactFilter = new ContactFilter();
return contactFilter;
}
private class ContactFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults filterResults = new FilterResults();
if (constraint!=null && constraint.length()>0) {
ArrayList<Contact> tempList = new ArrayList<Contact>();
for (Contact contact : contactList) {
if (contact.getName().toLowerCase().contains(constraint.toString().toLowerCase())) {
tempList.add(contact);
}
}
filterResults.count = tempList.size();
filterResults.values = tempList;
System.out.println("performFiltering:SearchFoundCount "+ tempList.size());
System.out.println("performFiltering:ActualSize "+ contactList.size());
} else {
filterResults.count = contactList.size();
filterResults.values = contactList;
}
return filterResults;
}
/**
* Notify about filtered list to ui
* @param constraint text
* @param results filtered result
*/
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filterContactList = (ArrayList<Contact>) results.values;
notifyDataSetChanged();
}
}
}
公共类CustomContactAdapter扩展了RecyclerView.Adapter
实现CompoundButton.OnCheckedChangeListener,可筛选{
语境;
拉平机;
private List contactList=new ArrayList();
私有列表筛选器ContactList=new ArrayList();
私人通讯过滤器;
公共CustomContactAdapter(上下文,列出联系人)
{
mInflater=LayoutInflater.from(上下文);
mContext=上下文;
this.contactList=联系人;
this.filterContactList=联系人;
}
公共静态类ContactViewHolder扩展了RecyclerView.ViewHolder
实现View.OnClickListener{
@BindView(R.id.member\u name)
TextView mContactName;
@BindView(R.id.member_mobile)
文本视图mPhoneNumber;
@BindView(R.id.member_图像)
图像视图模拟图像;
公共联系人视图持有人(视图){
超级(视图);
ButterKnife.bind(这个,视图);
view.setOnClickListener(这个);
}
@凌驾
公共void onClick(视图){
}
}
@凌驾
public CustomContactAdapter.ContactViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.member\u list\u row,parent,false);
返回新的CustomContactAdapter.ContactViewHolder(itemView);
}
@凌驾
BindViewHolder上的公共无效(CustomContactAdapter.ContactViewHolder,int位置){
联系人=联系人列表。获取(位置);
holder.mContactName.setText(contact.getName());
holder.mPhoneNumber.setText(contact.getMobile());
}
@凌驾
public int getItemCount(){
返回filterContactList.size();
}
@凌驾
公共过滤器getFilter(){
如果(contactFilter==null)
contactFilter=新的contactFilter();
回路滤波器;
}
私有类ContactFilter扩展了筛选器{
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
FilterResults FilterResults=新的FilterResults();
if(constraint!=null&&constraint.length()>0){
ArrayList tempList=新的ArrayList();
用于(联系人:联系人列表){
if(contact.getName().toLowerCase().contains(constraint.toString().toLowerCase())包含{
圣殿骑士。添加(联系人);
}
}
filterResults.count=templast.size();
filterResults.values=模板列表;
System.out.println(“performFiltering:SearchFoundCount”+templast.size());
System.out.println(“performFiltering:ActualSize”+contactList.size());
}否则{
filterResults.count=联系人li
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults
results) {
contactList= (ArrayList<Contact>) results.values;
notifyDataSetChanged();
}