1

Ich habe eine SearchView mit einem RecyclerView, der eine Kontaktliste durchsuchen soll. Aber die Ergebnisse der Suchergebnisse scheinen falsch zu sein. Einige Filterung geschieht, aber nicht die richtige. Wenn ich zum Beispiel mit dem Buchstaben "a" suche, wird etwas zufälliges anstelle von Kontakte herausgefiltert, beginnend mit a. Codefragmente wie unten.SearchView-Filter mit RecyclerView-Filterung mit falschen Ergebnissen

Aktivität Klasse

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

Adapter Klasse

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

nicht in der Lage, dieses Recht zu machen zu bekommen, kann etwas albern ich vermisse‘. Schätzen Sie jede Hilfe.

Antwort

2

Ich machte etwas ähnliches in meiner App. In onBindViewHolder sollten Sie die gefilterte Liste statt der anfänglichen

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

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

Hoffnung verwenden, um dies für Sie arbeitet. :)

+0

danke Kumpel .. das war ein dummer Fehler von mir ... Danke nochmal, das hat funktioniert – user2695433

1

Vielleicht möchten Sie, dass Ihr Suchergebnis mit Ihrem Charakter beginnt und dann Ihre FilterResults-Methode ändert.

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

Dies könnte auch funktionieren. Ändern Sie einfach den folgenden Code

@SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults 
     results) { 
    contactList= (ArrayList<Contact>) results.values; 
    notifyDataSetChanged(); 
} 
Verwandte Themen