1

RecyclerViewを持つSearchViewを使用して、連絡先を検索します。しかし、検索結果の結果は間違っているようです。いくつかのフィルタリングが行われていますが、正しいフィルタリングはありません。たとえば、文字「a」で検索すると、「a」で始まる連絡先ではなくランダムなものが除外されます。コードスニペットは次のとおりです。RecyclerViewで検索結果が誤っているフィルタが見つかった

活動クラス

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(); 
    } 
} 
} 
この権利を得ることを確認する

できない、私は行方不明「M愚かなものになることがあります。 助けてください。

答えて

2

私のアプリでも同様のことをやっていました。 onBindViewHolderで あなたの代わりに、これはあなたのために働く最初の1

@Override 
public void onBindViewHolder(CustomContactAdapter.ContactViewHolder holder, int position) { 

Contact contact = filterContactList.get(position); 
... 

希望のフィルタリングされたリストを使用する必要があります。 :)

+0

私は愚かな間違いでした。 – user2695433

1

あなたの検索結果があなたのキャラクターから始まり、あなたのFilterResultsメソッドを変更したいことがありますか?

for (Contact contact : contactList) { 
      if (contact.getName().toLowerCase().startsWith(constraint.toString().toLowerCase())) { 
       tempList.add(contact); 
      } 
     } 
0

これも有効です。次のコードを変更するだけです

@SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults 
     results) { 
    contactList= (ArrayList<Contact>) results.values; 
    notifyDataSetChanged(); 
} 
関連する問題