19

如何将ArrayAdapter<String>静态数据转换为CursorAdapter以使用SearchView中的Suggestion Listener? 我已经构建了从静态数据(allString将ArrayAdapter转换为CursorAdapter以便在SearchView中使用

ArrayAdapter<String> searchAdapter = new ArrayAdapter<String>(context, R.layout.listitem, allString); 

,我使用它的MultiAutoCompleteTextView这在设备与API级工作正常,小于11

MultiAutoCompleteTextView findTextView.setAdapter(searchAdapter); 

但是我的目标API是水平ArrayAdapter<String>是11和API> 10我使用ActionBar其中我想有一个SearchView来代替。

这是我尝试过的:它确实显示ActionBar与嵌入式SearchView,但没有给出任何建议,因为它会在MultiAutoCompleteTextView中提供任何建议。

@Override 
public boolean onCreateOptionsMenu(Menu menu) {  
     MenuInflater inflater = getMenuInflater(); 

     if (android.os.Build.VERSION.SDK_INT > 10){ 
      inflater.inflate(R.menu.menu11, menu); 
      searchView = (SearchView) menu.findItem(R.id.MENU_SEARCH).getActionView(); 
      int[] to = {0}; 
      CursorAdapter cursorAdapter = new SimpleCursorAdapter(context, R.layout.listitem, null, allBusStopString, to); 
      searchView.setSuggestionsAdapter(cursorAdapter); 
      searchView.setOnSuggestionListener(new OnSuggestionListener() { 

       @Override 
       public boolean onSuggestionClick(int position) { 
        String selectedItem = (String)cursorAdapter.getItem(position); 
        Log.v("search view", selectedItem); 
        return false; 
       } 

       @Override 
       public boolean onSuggestionSelect(int position) { 
        return false; 
       } 
      }); 
     }else{ 
      inflater.inflate(R.menu.menu, menu); 
     } 

    return true; 
} 

回答

28

这很奇怪SearchView.setSuggestionsAdapter只接受CursorAdapter。

您可以创建MatrixCursor并用字符串数组填充数据。我希望你有小数据收集。

然后将光标传递给CursorAdapter。

String[] columnNames = {"_id","text"} 
    MatrixCursor cursor = new MatrixCursor(columnNames); 
    String[] array = getResources().getStringArray(R.array.allStrings); //if strings are in resources 
    String[] temp = new String[2]; 
    int id = 0; 
    for(String item : array){ 
     temp[0] = Integer.toString(id++); 
      temp[1] = item; 
     cursor.addRow(temp); 
    }    
    String[] from = {"text"}; 
    int[] to = {R.id.name_entry}; 
    busStopCursorAdapter = new SimpleCursorAdapter(context, R.layout.listentry, cursor, from, to); 
+0

感谢,它的工作。 – 2012-07-24 10:56:33

+1

我只是不得不添加_id列以避免错误解释[这里](http://stackoverflow.com/questions/3360605/column-id-does-not-exist) – 2012-07-24 11:05:24

+0

是的,我忘了'_id' – pawelzieba 2012-07-24 11:22:57

11

我正面临类似的问题。您可以使用SearchView.setSuggestionsAdapter(),它只接受CursorAdapter。另一方面......有什么意义呢?如果您使用标准<android.support.v7.widget.SearchView />,则它包含SearchAutoComplete,它扩展了AppCompatAutoCompleteTextView。下面的代码为我工作:

List<String> items = Lists.newArrayList(new String[] {"aaaaa", "bbbbb", "ccccc", "ddddd"}); 
SearchView searchView = (SearchView) findViewById(R.id.autocomplete_searchview); 
SearchView.SearchAutoComplete searchSrcTextView = (SearchView.SearchAutoComplete) findViewById(android.support.v7.appcompat.R.id.search_src_text); 
searchSrcTextView.setThreshold(1); 
searchSrcTextView.setAdapter(new SuggestionAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, items)); 
searchSrcTextView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     return; 
    } 
}); 

和下面的适配器代码:

public class SuggestionAdapter<T> extends ArrayAdapter<T> { 

    private List<T> items; 
    private List<T> filteredItems; 
    private ArrayFilter mFilter; 

    public SuggestionAdapter(Context context, @LayoutRes int resource, @NonNull List<T> objects) { 
     super(context, resource, Lists.<T>newArrayList()); 
     this.items = objects; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public T getItem(int position) { 
     return items.get(position); 
    } 

    @Override 
    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new ArrayFilter(); 
     } 
     return mFilter; 
    } 

    public int getCount() { 
     //todo: change to pattern-size 
     return items.size(); 
    } 

    private class ArrayFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 
      FilterResults results = new FilterResults(); 

      //custom-filtering of results 
      results.values = items; 
      results.count = items.size(); 

      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      filteredItems = (List<T>) results.values; 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 
} 
+0

无论您输入什么内容,这都会返回所有内容 – Mike6679 2017-03-28 04:03:19

+0

如果您没有真正的游标(手动填充游标是一个错误的补丁),这是最好的解决方案。它现在适用于我,但我需要更改一些示例代码: - 为searchAutoComplete(如searchView)创建findViewById。findViewById - 覆盖适配器的getItems和getCounts,使用filteredItems代替项目 - 很明显,您需要实现过滤器逻辑,如评论'//自定义过滤结果'所述。 非常感谢示例代码! – AliMola 2017-06-28 12:40:33

相关问题