2010-04-20 7 views
7

Jestem nowy w rozwoju Androida i wpadłem na problem, który trudno jest rozwiązać. Próbuję dowiedzieć się, jak poprawnie używać widżetu AutoCompleteTextView. Chcę utworzyć AutoCompleteTextView, korzystając z danych XML z usługi internetowej. Udało mi się go uruchomić, ale zdecydowanie nie jestem zadowolony z wyników.AutoCompleteTextView onItemClick pozycji pozycji lub id za pomocą HashMap

Chciałbym umieścić HashMap z parami id => name w AutoCompleteTextView i uzyskać identyfikator klikniętego elementu. Kiedy klikam na autouzupełnianie przefiltrowanego zestawu wyników, chcę wypełnić listę poniżej pola autouzupełniania, które również udało mi się dostać do pracy.

Sporządzono tak daleko:

  • autouzupełnianie działa dobrze dla prostego ArrayList, wszystkie dane filtrowane poprawne
  • Zdarzenie onItemClick poprawnie po kliknięciu
  • parent.getItemAtPosition (pozycja) zwraca poprawną reprezentację String klikany pozycja

Zdarzenie onItemClick (rodzic rodzica AdapterView, widok v, pozycja int, długi identyfikator) nie zachowuje się tak, jakbym chciał. Jak mogę znaleźć niefiltrowaną pozycję tablicy klikniętego elementu? Stanowisko przefiltrowanej jeden jest jeden nie jestem zainteresowany

Dalsze pytania:.

  • Jak obsługiwać HashMaps lub Zbiór w AutoCompleteTextView
  • Jak uzyskać prawo ItemID w przypadku onItemClick

Przeprowadziłem bardzo obszerne badania w tej sprawie, ale nie znalazłem żadnych cennych informacji, które mogłyby odpowiedzieć na moje pytania.

+0

Czy implementujesz 'Filterable' i używając metod' Filter # performFiltering() 'i' Filter # publishResults() '? – Joe

+0

Mam również do czynienia z tym samym problemem .... proszę dać rozwiązanie przyjaciołom – sarath

Odpowiedz

-1

Jak obsługiwać HashMaps lub Zbiór w AutoCompleteTextView

Można ustawić swój własny zasilacz. W swoim adapterze zależy od Ciebie, skąd otrzymujesz dane na dane stanowisko.

Jak uzyskać prawo ItemID w przypadku onItemClick

w Twojej adaptera, można zdefiniować filtr, a filtr wyznacza sugerowanych przedmiotów. Masz dwie różne listy, jedną z oryginalnymi wartościami i drugą z przefiltrowanymi przedmiotami. Mam na myśli coś takiego.

private class AutoCompleteItemAdapter extends ArrayAdapter<YourItemClass> implements Filterable { 

    private NameFilter  mFilter; 
    List<YourItemClass> suggestions; 
    List<YourItemClass> mOriginalValues; 

    public AutoCompleteItemAdapter(Context context, int resource, List<YourItemClass> suggestions) { 
     super(context, resource, suggestions); 
     this.suggestions = suggestions; 
     this.mOriginalValues = suggestions; 
    } 

    public void updateData(List<YourItemClass> suggestions) { 
       mLock.lock(); 
       try{ 
        this.suggestions = suggestions; 
         this.mOriginalValues = suggestions; 
      finally{ 
       mLock.unlock(); 
      } 
     } 

    @Override 
    public int getCount() { 
     mLock.lock(); 
     try { 
      return suggestions.size(); 
     } finally { 
      mLock.unlock(); 
     } 
    } 

    @Override 
    public YourItemClass getItem(int position) { 
     return mOriginalValues.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // draw your item here... 
    } 

    @Override 
    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new NameFilter(); 
     } 
     return mFilter; 
    } 

    private class NameFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 
      FilterResults results = new FilterResults(); 

      if (mOriginalValues == null) { 
       mLock.lock(); 
       try { 
        mOriginalValues = new ArrayList<YourItemClass>(suggestions); 
       } finally { 
        mLock.unlock(); 
       } 
      } 

      if (prefix == null || prefix.length() == 0) { 
       mLock.lock(); 
       try { 
        ArrayList<YourItemClass> list = new ArrayList<YourItemClass>(mOriginalValues); 
        results.values = list; 
        results.count = list.size(); 
       } finally { 
        mLock.unlock(); 
       } 
      } else { 
       String prefixString = prefix.toString().toLowerCase(); 

       final List<YourItemClass> values = mOriginalValues; 
       final int count = values.size(); 

       final ArrayList<YourItemClass> newValues = new ArrayList<YourItemClass>(count); 

       //    FILTERING 
       // 
        // add your hits to the newValues collection 
       // 
       // 
       results.values = newValues; 
       results.count = newValues.size(); 
      } 
      return results; 
     } 


     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      mLock.lock(); 
      try { 
       if (results == null || results.values == null) return; 
       suggestions = new ArrayList<YourItemClass>(); 
       suggestions = (List<YourItemClass>) results.values; 
       if (results.count > 0) { 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      } finally { 
       mLock.unlock(); 
      } 
     } 
    } 
} 

Teraz może to podnieść jakiś problem współbieżności, jak odniesienie, adapter może poprosić o wielkości listy, a większa wartość gaśnie, co może powodować problemy w funkcji getView. (fi .: Próba narysowania 5 elementów z bazowymi danymi ma tylko 4, ponieważ zrobiliśmy kolejne filtrowanie) W ten sposób użyliśmy naszego AutoCompleteTextView i jak na razie działa świetnie, bez problemu. Właśnie wspomniałem, że nadal jestem zaniepokojony i mam niejasne przekonanie, że istnieje lepsze rozwiązanie tego problemu.

W swoim detektorze onClick jako wartość w mapie używana jest zwracana wartość (z przefiltrowanej listy) i uzyskiwana jest powiązana z nią wartość.Możesz myśleć, że twoja lista używa indeksu dla HashMap. Następnie możesz użyć swojego Map, aby narysować swój przedmiot lub uzyskać własne dane.

+0

-1: To nie odpowiada na pytanie OP. '... Używasz zwróconej wartości (z przefiltrowanej listy) jako klucza na mapie ...' - Nie, nie, nie. Wartość * z przefiltrowanej listy nie jest * kluczem *. –