19

में उपयोग के लिए एक ArrayAdapter को CursorAdapter में कनवर्ट करना SearchView में सुझाव श्रोता का उपयोग करने के लिए मैं CursorAdapter में स्थिर डेटा के ArrayAdapter<String> को कैसे परिवर्तित कर सकता हूं? मैं स्थिर डेटा (allString)एक खोज दृश्य

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

और मैं एक MultiAutoCompleteTextView जो एपीआई स्तर के साथ उपकरणों में ठीक काम करता है के लिए इसका इस्तेमाल करते हैं कम से कम 11

MultiAutoCompleteTextView findTextView.setAdapter(searchAdapter); 

हालांकि मेरी लक्ष्य एपीआई स्तर है से ArrayAdapter<String> का निर्माण किया है 11 है और एपीआई> 10 के लिए मैं ActionBar का उपयोग करता हूं जिसके अंतर्गत मैं एक खोज दृश्य देखना चाहता हूं।

यहां मैंने जो कोशिश की है: यह 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 बना सकते हैं और इसे स्ट्रिंग सरणी से डेटा से भर सकते हैं। मुझे आशा है कि आपके पास छोटा डेटा संग्रह होगा।

फिर कर्सर को कर्सर एडाप्टर पर पास करें।

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() का उपयोग कर सकते हैं जो केवल कर्सर एडाप्टर स्वीकार करता है। दूसरी तरफ ... क्या बात है? यदि आप मानक <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

+0

यदि आपको असली कर्सर नहीं मिला है तो यह सबसे अच्छा समाधान है (एक कर्सर 'मैन्युअल रूप से' एक खराब पैच भरें)। यह अब मेरे लिए काम कर रहा है, लेकिन मुझे कुछ उदाहरण कोड बदलने की जरूरत है: - खोज के लिए findViewById बनाएं AutoComplete खोज की तरह देखें।findViewById - प्राप्त करने के लिए ओवरराइड प्राप्त करें और एडाप्टर की गणना करें, फ़िल्टर किए गए आइटम्स का उपयोग करें - यह स्पष्ट है कि आपको अपने फ़िल्टर तर्क को लागू करने की आवश्यकता है, जैसे टिप्पणी '// कस्टम-फ़िल्टरिंग परिणाम' कहा जाता है। उदाहरण कोड के लिए बहुत बहुत धन्यवाद! – AliMola

संबंधित मुद्दे