2010-10-26 35 views
3

任何人都可以亲切指导我如何在android中实现动态自动完成小部件。我的要求是,当我键入一个字母时,一个线程将工作,并将返回一个数组,最多5条建议。我需要在自动完成列表视图中显示这5个建议。在android中的动态自动填充小部件

专家请指导如何实施相同。

展望未来, 问候, 罗尼

回答

5

你有没有看AutoCompleteTextView?

它显示你想要的东西。现在,您只需要一个实现Filterable的适配器即可生成一组五个适配器。 Filterable表示实体将能够创建一个Filter对象。过滤器对象使用线程池并在单独的工作线程上分派过滤,并在UI线程上绑定到视图。

所以我们可以说,我们有

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

嗨格雷格,我要通过你的代码,并试图实现它在你上面描述的方式。同时,我自己做了一些研究并设法产生了一些对我来说99%完美的东西。我使用此代码的唯一问题(给出的pastebin链接)是大多数情况下,只有在自动填充小部件中输入第三个字母时才会显示建议。从我的角度来看,代码似乎是完美的。如果你能够知道我在http://pastebin.com/d9TT1izC中给出的代码出错的地方,那么它会有很大的帮助。那时候,我会试着完成你的建议。 – user264953 2010-10-26 19:30:26

+0

所以你的代码实际上是隐式使用这个可过滤的。事实上,只要键入功能和5的限制,就是自定义工作必须进入的位置。因此,请尝试将AutoCompleteTextView阈值设置为0,如果确实需要,可以扩展AutoCompleteTextView并覆盖enoughToFilter( )总是返回true。我上面的代码可以让你做一些限制列表大小为5.否则它将是无限的最匹配 – 2010-10-26 19:35:29

+0

你知道吗? – 2010-10-28 06:52:00