5

बॉक्स के बाहर, AutoCompleteTextView विजेट सूची मूल्य के मध्य में इनपुट स्ट्रिंग से मिलान करने में सक्षम नहीं प्रतीत होता है - मैचों को हमेशा शुरुआत में बनाया जाता है; उदाहरण के लिए, "ar" मिलान "argentina" दर्ज करें, लेकिन "hungary" नहीं।कस्टम ऑटोकंपलेटटेक्स्ट व्यू व्यवहार

मैं शब्द के मध्य में पाठ को कैसे खोज सकता हूं? क्या कोई मुझे एक विचार दे सकता है?

अग्रिम धन्यवाद!

+0

मैं इसी तरह यहाँ कुछ कर रहा हूँ !!! http://stackoverflow.com/questions/12854336/autocompletetextview-backed-by-cursorloader – toobsco42

उत्तर

5

आपको कस्टम Filter कक्षा लिखना होगा और performFiltering विधि स्वयं को लागू करना होगा। यह विधि CharSequence तर्क लेती है, जिसका उपयोग आप अपने डेटासेट से मिलान की सूची उत्पन्न करने के लिए आवश्यक स्ट्रिंग ऑपरेशंस करने के लिए कर सकते हैं (आपके मामले में, आप String.startsWith के बजाय String.contains का उपयोग कर सकते हैं)। यूआई थ्रेड पर performFiltering फ़ंक्शन नहीं चलाया जाता है।

फिर आप एक FilterResults वस्तु है, जो एक Objectमूल्यों शामिल (अपने मैचों की सूची, शायद एक ArrayList) और एक intगिनती जो मैचों की अपनी सूची के आकार के रूप में मैचों की अपनी सूची वापस जाएँ।

अंत में, publishResults कॉलबैक विधि, जो एक बार कार्यकर्ता धागा मैचों की सूची उत्पन्न किया है, तो आप अपने AutoCompleteTextView के एडाप्टर पर notifyDataSetChanged कॉल करने के लिए इतना है कि यह परिणाम प्रदर्शित कर सकते हैं अनुमति देता है रिटर्न लागू।

+0

क्या आप कृपया मुझे एक उदाहरण दे सकते हैं? – Chrishan

+0

मुझे पता है कि यह उत्तर के बाद से काफी समय रहा है, लेकिन यह इस विषय के बारे में सबसे सटीक है (और खोजने में सबसे मुश्किल है, बीटीडब्ल्यू) में से एक है। धन्यवाद! – nKn

+1

विक्टर सही है, यहां आसान तरीका है: CustomArrayAdapter नामक एक नई कक्षा में android.widget.ArrayAdapter की पूरी सामग्री को कॉपी-पेस्ट करें और प्रदर्शन में स्थित 2 "स्टार्टविथ" घटनाओं को बदलें और "इसमें शामिल" प्रकाशित करें। सरल। –

0

मेरी सलाह स्ट्रिंग को एक वर्ण सरणी में पार्स करना होगा। फिर स्ट्रिंग मिलने तक प्रत्येक वर्ण को फिर से चालू करें।

उदाहरण के लिए कहते हैं कि अपनी खोज के साथ "खा" उन में और शब्द सूची था ...

राज्य विशेषता धमकाना सभी शब्दों देखना चाहता है की सुविधा देता है देर

आपका एल्गोरिथ्म की तरह कुछ जाना चाहिए यह

स्ट्रिंग लें और इसे एक वर्ण सरणी में पार्स करें सरणी के माध्यम से लूप करें और पहले "सही चरित्र" को ढूंढें (हमारे उदाहरण में 'ए') एक बार जब चरित्र पाया जाता है तो n ext अक्षर, प्रत्येक चरित्र को एक मैच के लिए जांचते रहें जब तक कि मूल्य की खोज पूरी नहीं हो जाती। यदि चरित्र एक मैच नहीं है तो सरणी पुनरावृत्ति से बाहर निकलें और अगले शब्द पर जाएं।

3

पुराना सवाल, लेकिन अभी भी प्रासंगिक है। कुछ अन्य सवालों के मार्गदर्शन के बाद फ़िल्टर करने योग्य का उपयोग कर एक कस्टम एडाप्टर लागू किया। मैंने एक सरल जेनेरिक एडाप्टर बनाया है जिसमें खोज शामिल है। इस पर त्वरित नोट्स:

मैं तितली का उपयोग कर रहा हूं, लेकिन findviewbyid के साथ दर्शक को देखना आसान है।

लेआउट R.layout.list_item_simple टेक्स्टव्यू R.id.text_view_simple के साथ एक साधारण लेआउट है।

ऑब्जेक्ट को एक टॉस्ट्रिंग की आवश्यकता है जिसकी तुलना की जाएगी।

public class SimpleContainsAutocompleteAdapter <T> extends ArrayAdapter<T> implements Filterable { 
    private List <T> listObjects; 
    List<T> suggestions = new ArrayList<>(); 
    private int resource; 

    private Filter mFilter = new Filter(){ 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 

      if(constraint != null) { 
       suggestions.clear(); 
       for(T object : listObjects){ 
        if(object.toString().toLowerCase().contains(constraint.toString().toLowerCase())){ 
         suggestions.add(object); 
        } 
       } 

       filterResults.values = suggestions; 
       filterResults.count = suggestions.size(); 
      } 

      return filterResults; 
     } 

     @Override 
     protected void publishResults(CharSequence contraint, FilterResults results) { 
      if(results == null){ 
       return; 
      } 

      List<T> filteredList = (List<T>) results.values; 
      if(results.count > 0) { 
       clear(); 
       for (T filteredObject : filteredList) { 
        add(filteredObject); 
       } 
       notifyDataSetChanged(); 
      } 
     } 
    }; 

    public SimpleContainsAutocompleteAdapter(Context context, List<T> listObjects) { 
     super(context, R.layout.list_item_simple, listObjects); 
     this.listObjects = new ArrayList<>(listObjects); 
     this.resource = R.layout.list_item_simple; 
    } 

    @Override 
    public Filter getFilter() { 
     return mFilter; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     Object listObject = getItem(position); 
     viewHolder holder; 
     if(convertView != null) { 
      holder = (viewHolder) convertView.getTag(); 
     }else{ 
      convertView = LayoutInflater.from(getContext()).inflate(resource, parent, false); 
      holder = new viewHolder(convertView); 
      convertView.setTag(holder); 
     } 

     holder.name.setText(listObject.toString()); 

     return convertView; 
    } 


    static class viewHolder { 
     @InjectView(R.id.text_view_simple) TextView name; 

     public viewHolder(View view) { 
      ButterKnife.inject(this, view); 
     } 
    } 
} 
+0

यह जवाब है, मुझे कुछ बदलाव करना था लेकिन सही काम करता था। – sdelvalle57

1
public class AutoCompleteAdapter <T> extends ArrayAdapter<T> implements Filterable { 
    private List <T> listObjects; 
    List<T> suggestions = new ArrayList<>(); 
    private Context context; 
    public AutoCompleteAdapter(Context context, List<T> listObjects) { 
     super(context, R.layout.list_item_simple, listObjects); 
     this.listObjects = new ArrayList<>(listObjects); 
     this.context = context; 
    } 
    private Filter mFilter = new Filter(){ 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 
      if(constraint != null) { 
      suggestions.clear(); 
       for(T object : listObjects){ 
        if(object.toString().toLowerCase().contains(constraint.toString().toLowerCase())){      suggestions.add(object); 
       } 
      } 

      filterResults.values = suggestions; 
      filterResults.count = suggestions.size(); 
     } 
     return filterResults; 
    } 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 
     if(results == null){ 
      return; 
     } 
     List<T> filteredList = (List<T>) results.values; 
     if(results.count > 0) { 
      clear(); 
      for (T filteredObject : filteredList) { 
       add(filteredObject); 
      } 
      notifyDataSetChanged(); 
     } 
    } 
}; 
@Override 
public Filter getFilter() { 
    return mFilter; 
} 
private static class ViewHolder { 
    TextView title; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Object listObject = getItem(position); 
    final ViewHolder viewHolder; // view lookup cache stored in tag 
    if (convertView == null) { 
     viewHolder = new ViewHolder(); 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(R.layout.list_item_simple, parent, false); 
     viewHolder.title = (TextView) convertView.findViewById(R.id.title); 
     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    viewHolder.title.setText(listObject.toString()); 
    return convertView; 
} 

}

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