19

SearchView에서 추천 리스너를 사용하기 위해 ArrayAdapter<String> 개의 정적 데이터를 CursorAdapter으로 변환하려면 어떻게해야합니까? 나는 정적 데이터 (allString)SearchView에서 ArrayAdapter를 CursorAdapter로 변환

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

내가 미만 11

MultiAutoCompleteTextView findTextView.setAdapter(searchAdapter); 

그러나 내 목표 API 레벨은 API 레벨 장치에서 잘 작동하는 MultiAutoCompleteTextView을 위해 사용에서 ArrayAdapter<String>을 건설 한 11이고 API> 10 인 경우을 사용하고 그 대신 SearchView를 사용하고 싶습니다.

다음은 내가 시도한 것입니다. 이 포함 된 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을 만들고 문자열 배열에서 데이터로 채울 수 있습니다. 소규모 데이터 수집을 바랍니다.

그런 다음 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

덕분에, 그것은했다. 난 그냥 오류를 방지하기 위해 _ID 열을 추가했다 –

+1

는 [여기] (http://stackoverflow.com/questions/3360605/column-id-does-not-exist) –

+0

예 실제로, 나는 잊었다 설명' – 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