2012-07-01 10 views
9

Jest moment w mojej aplikacji, który muszę wymusić, aby wyświetlić wszystkie elementy na liście sugestii, bez względu na to, co użytkownik wpisał. Jak mogę to zrobić?Siła AutoCompleteTextView pokazująca wszystkie elementy

Próbowałem zrobić coś z filtrowaniem, ale dla mnie jako początkującego filtrowanie jest po prostu zbyt skomplikowane, próbowałem samemu przeszukiwać samouczek dla początkujących bez żadnego szczęścia. Być może istnieje prostszy sposób na wymuszenie pokazywania wszystkich elementów sugestii?

EDYCJA: Zasadniczo mój pomysł polegał na tym, że gdy użytkownik wpisze coś, czego nie ma na liście, pokazuje wszystkie dostępne opcje.

Znalazłem najlepszy sposób sprawdzania pogody, czy ACTV jest pokazany beign, czy nie, ale onTextChangeEvent Porównuję tekst wpisany przez użytkownika z moją listą, a następnie, jeśli żadne elementy nie zostały znalezione, pokaż pełną listę.

Odpowiedz

8

Zasadniczo, po 5-6 godzinach eksperymentów, aby zrozumieć, jak działa filtr cholera, ja napisałem swój własny zasilacz, który robi dokładnie to, co chcę:

public class burtuAdapteris extends ArrayAdapter<String> implements Filterable { 

     ArrayList<String> _items = new ArrayList<String>(); 
     ArrayList<String> orig = new ArrayList<String>(); 

     public burtuAdapteris(Context context, int resource, ArrayList<String> items) { 
      super(context, resource, items);  

      for (int i = 0; i < items.size(); i++) { 
       orig.add(items.get(i)); 
      } 
     } 

     @Override 
     public int getCount() { 
      if (_items != null) 
       return _items.size(); 
      else 
       return 0; 
     } 

     @Override 
     public String getItem(int arg0) { 
      return _items.get(arg0); 
     } 


     @Override 

     public Filter getFilter() { 
      Filter filter = new Filter() { 
       @Override 
       protected FilterResults performFiltering(CharSequence constraint) { 

        if(constraint != null) 
         Log.d("Constraints", constraint.toString()); 
        FilterResults oReturn = new FilterResults(); 

       /* if (orig == null){ 
        for (int i = 0; i < items.size(); i++) { 
         orig.add(items.get(i)); 
        } 
        }*/ 
        String temp; 
        int counters = 0; 
        if (constraint != null){ 

         _items.clear(); 
         if (orig != null && orig.size() > 0) { 
          for(int i=0; i<orig.size(); i++) 
          {       
           temp = orig.get(i).toUpperCase(); 

           if(temp.startsWith(constraint.toString().toUpperCase())) 
           { 

            _items.add(orig.get(i));    
counters++; 

           } 
          } 
         } 
         Log.d("REsult size:" , String.valueOf(_items.size())); 
          if(!counters) 
          { 
          _items.clear(); 
          _items = orig; 
          } 
         oReturn.values = _items; 
         oReturn.count = _items.size(); 
        } 
        return oReturn; 
       } 


       @SuppressWarnings("unchecked") 
       @Override 
       protected void publishResults(CharSequence constraint, FilterResults results) { 
        if(results != null && results.count > 0) { 
         notifyDataSetChanged(); 
         } 
         else { 
          notifyDataSetInvalidated(); 
         } 

       } 

      }; 

      return filter; 

     } 


} 

I to proste w obsłudze, wystarczy zastąpić oryginalny zasilacz z tym:

final burtuAdapteris fAdapter = new burtuAdapteris(this, android.R.layout.simple_dropdown_item_1line, liste); 

w moim przypadku jest Liste: ArrayList<String> liste = new ArrayList<String>();

+2

Kopiuję i wklejam, ale pozostawiam nazwę BurtuAdapter w hołdzie twojemu dziełu. :) – brainmurphy1

11

Nie definiujesz "momentu", kiedy chcesz wyświetlić wszystkie wyniki, więc mam nadzieję, że to pasuje. Ale spróbuj coś takiego:

AutoCompleteTextView autoComplete; 
String savedText; 

public void showAll() { 
    savedText = autoComplete.getText().toString(); 
    autoComplete.setText(""); 
    autoComplete.showDropDown(); 
} 

public void restore() { 
    autoComplete.setText(savedText); 
} 
+1

Kiedy próbowałem to ja od razu dostał „Niestety, ta aplikacja została zatrzymana " Naprawdę nie rozumiem, gdzie powinienem jednak użyć funkcji przywracania. – XCoder

+0

Dobra, potrzebuję kontekstu do twojego pytania. Opublikuj odpowiedni kod, który napisałeś w swoim pytaniu, i opisz moment, w którym chcesz wyświetlić wszystko. – Sam

+0

Edytowałem i próbowałem wyjaśnić dokładniej, co Im po – XCoder

-1

To nawet łatwiejsze niż na liście Sama. Gdy chcesz pokazać wszystkim, po prostu zrobić:

performFiltering("", 0); 

Kiedy filtrowanie kończy będzie ona automatycznie wyświetlić rozwijane ze wszystkich elementów widocznych.

+0

Czy mógłbyś podać trochę więcej kontekstu? performFiltering() jest chronioną metodą klasy [Filter] (http://developer.android.com/reference/android/widget/Filter.html). Wygląda na to, że potrzebuję podklasy Filtru, żeby dostać się w jej ręce. – ge0rg

+0

Nie pracuję już dla firmy, w której byłem, kiedy to napisałem, i nie dotknąłem Androida od czasu opuszczenia ich w grudniu, więc niestety nie mam już dostępu do tego kodu w kontekście. Przepraszam. – ArtOfWarfare

2

Metoda wymusić pokazu rozwijanej listy.

należy wywołać requestFocus(); żeby pokazać klawiaturę inaczej klawiatura się nie wyskoczy.

autocomptv.setOnTouchListener(new OnTouchListener() { 

     @SuppressLint("ClickableViewAccessibility") 
     @Override 
     public boolean onTouch(View paramView, MotionEvent paramMotionEvent) { 
      // TODO Auto-generated method stub 
      autocomptv.showDropDown(); 
      autocomptv.requestFocus(); 
      return false; 
     } 
    }); 
1

To działa na mnie idealnie, jest to łatwy sposób, aby rozwiązać problem:

final ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_dropdown_item_1line, usernameLists); 
    etUsername.setThreshold(1); 
    etUsername.setAdapter(adapter); 
    etUsername.setOnTouchListener(new View.OnTouchListener() { 

     @SuppressLint("ClickableViewAccessibility") 
     @Override 
     public boolean onTouch(View paramView, MotionEvent paramMotionEvent) { 
      if (usernameLists.size() > 0) { 
       // show all suggestions 
       if (!etUsername.getText().toString().equals("")) 
        adapter.getFilter().filter(null); 
       etUsername.showDropDown(); 
      } 
      return false; 
     } 
    }); 
+0

Lol jest o wiele krótszy i prostszy od innych rozwiązań, wykonuje pracę, używając AutoCompleteTextView zamiast tego cholernego Spinnera, dzięki czemu mogę ustawić podpowiedź i błąd i nigdy więcej nie będę musiał używać tego pokrętła, dzięki :) – user3718908

+0

Użyłem OnClickListener jednak i ustaw właściwość focable na wartość false. – user3718908

0

Jako "ArtOfWarfare" zasugerował, można po prostu sub-klasę i zastąpić performFiltering():

public class My_AutoCompleteTextView extends AutoCompleteTextView { 
    public My_AutoCompleteTextView(Context context) { 
     super(context); 
    } 
    public My_AutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
    public My_AutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected void performFiltering(CharSequence text, int keyCode) { 
     super.performFiltering("", 0); 
    } 
} 
1

Jeśli chcesz natychmiast wyświetlić sugestie, musisz zastąpić enoughToFilter(), aby zawsze zwracać wartość true. Aby zignorować wprowadzone dane jako tekst, musisz użyć performFiltering("", 0) z pustym wzorcem filtrowania. AutoCompleteTextView wyświetla wtedy wszystkie sugestie.

Jest to rozwiązanie, jakie w połączeniu z innych stanowisk StackOverflow:

public class InstantAutoComplete extends android.support.v7.widget.AppCompatAutoCompleteTextView { 
    public InstantAutoComplete(Context context) { 
     super(context); 
    } 

    public InstantAutoComplete(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public InstantAutoComplete(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    public boolean enoughToFilter() { 
     return true; 
    } 

    @Override 
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 
     super.onFocusChanged(focused, direction, previouslyFocusedRect); 

     if (focused && getAdapter() != null) { 
      performFiltering("", 0); 
     } 
    } 
} 
0

To co pracował dla mnie:

public class CustomAutoCompleteTextView extends AutoCompleteTextView { 
    public CustomAutoCompleteTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public boolean enoughToFilter() { 
     return true; 
    } 

    @Override 
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { 
     super.onFocusChanged(focused, direction, previouslyFocusedRect); 
     if (focused) { 
      performFiltering(getText(), 0); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     this.showDropDown(); 
     return super.onTouchEvent(event); 
    } 
} 
Powiązane problemy