19

SearchViewで提案リスナーを使用するために、ArrayAdapter<String>の静的データをCursorAdapterに変換するにはどうすればよいですか? 私は静的なデータからArrayAdapter<String>allStringArrayAdapterをSearchViewで使用するためにCursorAdapterに変換する

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

を構築してきたし、私のターゲットAPIレベルであるしかし、私はAPIレベルでのデバイスで正常に動作MultiAutoCompleteTextView未満11

MultiAutoCompleteTextView findTextView.setAdapter(searchAdapter); 

のためにそれを使用します11であり、API> 10の場合はActionBarを使用して、代わりにSearchViewを使用したいと考えています。

私が試したことは次のとおりです。ActionBarと埋め込みSearchViewが表示されていますが、MultiAutoCompleteTextViewのような提案はありません。 SearchView.setSuggestionsAdapterおかしい

@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

はCursorAdapterを受け付けます。

MatrixCursorを作成し、String配列のデータで埋め込むことができます。私は小さなデータ収集があることを願っています。

次に、カーソルを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

おかげで、それが働きました。 –

+1

私はエラーを避けるために_idカラムを追加するだけでした[ここ](http://stackoverflow.com/questions/3360605/column-id-does-not-exist) –

+0

はい、本当に '_id'について忘れました – pawelzieba

11

私は同様の問題に直面していました。 SearchView.setSuggestionsAdapter()は、のCursorAdapterのみを受け入れます。一方、...ポイントは何ですか?標準<android.support.v7.widget.SearchView />を使用すると、内部にAppCompatAutoCompleteTextViewを拡張するSearchAutoCompleteが含まれます。次のコードは、私の仕事:

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

+0

これは、実際のカーソルを持っていない場合に最適な解決策です(カーソルを "手動で入力する"が悪いパッチです)。私のために働いていますが、サンプルコードの一部を変更する必要がありました。 - searchViewのようなsearchAutoCompleteのfindViewByIdを作成します。findViewById - アダプターのgetItemsとgetCountsをオーバーライドし、代わりにfilteredItemsを使用してください。 - コメント '//結果のカスタムフィルタリング'のように、フィルターロジックを実装する必要があります。 サンプルコードはありがとうございます! – AliMola

関連する問題