2016-03-28 10 views
2

Ich verwende einen MultiAutoCompleteTextView und setze meinen eigenen Adapter (BaseAdapter) darauf. Aber jedes Mal, wenn ich etwas in MultiAutoCompleteTextView schreibe, erhält die Einschränkung in der performFiltering Methode für jedes Zeichen, das ich schreibe, immer einen Nullwert.MultiAutoCompleteTextView mit benutzerdefiniertem Adapter (BaseAdapter)

Hier ist mein Code für die BaseAdapter Klasse:

public class ListItemAdapter extends BaseAdapter implements Filterable{ 
    ArrayList<ListItem> listItems; 
    ArrayList<ListItem> suggestions = new ArrayList<>(); 
    private Filter filter = new CustomFilter(); 
    Context context; 
    LayoutInflater inflater; 

    public ListItemAdapter(ArrayList<ListItem> listItems, Context context) { 
     this.listItems = listItems; 
     this.context = context; 
     inflater = (LayoutInflater) context.getSystemService(LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return listItems.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return listItems.get(position); 
    } 

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

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 

     v = inflater.inflate(R.layout.single_item, null); 
     TextView title = (TextView) v.findViewById(R.id.title); 

     title.setText(listItems.get(position).getTitle()); 
     return v; 
    } 

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

    private class CustomFilter extends Filter { 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      suggestions.clear(); 

      Log.d("FILTERRES", ""+listItems.size() + ", " + constraint); 

      if(listItems != null && constraint != null) { 
       for(int i=0 ; i<listItems.size(); i++) { 
        if(listItems.get(i).getTitle().toLowerCase().contains(constraint)) { 
         suggestions.add(listItems.get(i)); 
        } 
       } 
      } 

      FilterResults results = new FilterResults(); 
      results.values = suggestions; 
      results.count = suggestions.size(); 
      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      if(results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 
    } 
} 

Hier ist, wie ich den Adapter an MultiAutoCompleteTextView bin Einstellung:

MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.auto); 
ListItemAdapter adapter = new ListItemAdapter(items, this); 
textView.setThreshold(1); 
textView.setAdapter(adapter); 

Was mache ich falsch hier?

bearbeiten: Ich änderte meine MultiAutoCompleteTextView-AutoCompleteTextView und jetzt ist es funktioniert, weiß jemand, wie man es für MultiAutoCompleteTextView funktioniert?

Antwort

2

Sie müssen setTokenizer() zu Ihrem MultiAutoCompleteTextView, um es zu arbeiten.

können Sie verwenden -

textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); 

Auch Sie Ihre eigenen tokenizer festlegen können, wenn Sie spezielle Wünsche haben sonst können Sie CommaTokenizer verwenden, das Komma anhängt (,) jedes Mal wenn Sie aus der Drop-Down-beliebige Option auswählen.