Dynamic autocomplete widget in android

前端 未结 1 1937
有刺的猬
有刺的猬 2021-01-03 11:28

Can anyone kindly guide me as to how to implement a dynamic auto complete widget in android. My requirement is, as I type a letter, a thread will work and will return an arr

相关标签:
1条回答
  • 2021-01-03 11:50

    Have you looked at AutoCompleteTextView?

    It does the display of what you want. Now all you need is an adapter that implements Filterable to generate the set of five. Filterable says that an entity will be able to create a Filter object. Filter objects use a thread pool and dispatch the filtering on a separate worker thread and the binding to the view on the UI thread.

    So let's say we have

    public class TextAdapter extends BaseAdapter implements Filterable {
       List<String> myList;
       Filter myFilter;
       TextAdapter(String[] strings) {
          myList = Arrays.asList(strings);
          myFilter = new MyFilter(myList);
       }
    
       ...
       // implement the BaseAdapter methods as needed to manage the list.
       //
    
       public void setContents(List<String> strs) {
         myList.clear();
         myList.addAll(strs);
         mFilter = new Filter(myList);
       }
    
       public Filter getFilter() {
         return myFilter;
       }
    
       private final class MyFilter implements Filter {
           final List<String> mOriginalList;
           public MyFilter(List<String> list) {
              mOriginalList = new ArrayList<String>(list);
           }
    
           public Filter.FilterResults performFiltering(CharSequence constraint) {
                   // Search through your original list 
                   Filter.FilterResults results = new Filter.FilterResults();
                   List<String> strs = new ArrayList<String>();
                   if (TextUtils.isEmpty(constraint)) {
                       strs.addAll(myOriginalList);
                   }
                   for (String str : myOriginalList) {
                      if (matches(str, constraint)) {
                       strs.add(str);
                      }
                   }
                   if (results.size > 5) {
                      // prune the list to your own tastes
    
                   }
                   results.count = strs.size();
                   results.value = strs;
           }
    
           public void publishResults(CharSequence constraint, Filter.FilterResults results)
                setContents((List<String>)results.value);
                notifyDatasetChanged();
           }
    
           public boolean matches(String str, CharSequence value) {
              /// implement this part
               }
    
            }
        }
    
    0 讨论(0)
提交回复
热议问题