2010-04-20 5 views
7

Я новичок в разработке Android, и у меня возникла проблема, которую мне трудно решить. Я пытаюсь выяснить, как правильно использовать виджет AutoCompleteTextView. Я хочу создать AutoCompleteTextView, используя данные XML из веб-службы. Мне удалось заставить его работать, но я уверенно не доволен выходом.AutoCompleteTextView onItemНажмите позицию позиции или идентификатор, используя HashMap

Я хотел бы поставить HashMap с идентификационными парами id => в AutoCompleteTextView и получить идентификатор щелкнутого элемента. Когда я нажимаю на выходной файл с автозаполненным фильтром, я хочу заполнить список под полем автозаполнения, который мне также удалось получить.

Done до сих пор:

  • автозаполнение работает хорошо для простых ArrayList, все данные фильтруются правильно
  • onItemClick событие срабатывает должным образом после нажмите
  • parent.getItemAtPosition (позиция) возвращает правильное представление нитки клики item

Событие onItemClick (родительский элемент AdapterView, View v, int position, long id) не ведет себя так, как хотелось бы. Как я могу определить позицию нефильтрованного массива щелкнутого элемента? Положение отфильтрованной один является один я не заинтересован в

Дальнейшие вопросы:.

  • Как обрабатывать HashMaps или Коллекции в AutoCompleteTextView
  • Как получить право Itemid в случае onItemClick

Я провел очень обширные исследования по этой проблеме, но не нашел никакой ценной информации, которая отвечала бы на мои вопросы.

+0

Вы используете 'Filterable' и используете' Filter # performFiltering() 'и' Filter # publishResults() 'методы? – Joe

+0

Я также сталкиваюсь с той же проблемой .... pls дают друзьям решения – sarath

ответ

-1

Как обрабатывать HashMaps или Коллекции в AutoCompleteTextView

Вы можете установить свой собственный адаптер. В вашем адаптере это зависит от вас, где вы получаете данные на заданную позицию.

Как получить право Itemid в случае onItemClick

В пользовательском адаптере, можно определить фильтр, и что наборы фильтров предложенных пунктов. У вас есть два разных списка: один с исходными значениями, а другой - с отфильтрованными элементами. Я имею в виду что-то вроде этого.

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(); 
      } 
     } 
    } 
} 

Теперь это может вызвать некоторые проблемы параллелизма, как ссылку, адаптер может попросить размер списка, и больше значения выходит, что может вызвать проблемы в функции GetView. (fi: Попытка нарисовать 5 элементов с базовыми данными имеет только 4, потому что мы сделали еще одну фильтрацию). Так мы использовали наш AutoCompleteTextView, и до сих пор он отлично работает, без проблем. Я только что упомянул, что меня все еще беспокоит, и у меня есть это смутное чувство, что для этого есть лучшее решение.

В вашем слушателе onClick вы используете возвращаемое значение (из отфильтрованного списка) в качестве ключа на вашей карте и получаете связанное значение.Вы можете подумать, что в вашем списке используется индекс для HashMap. После этого вы можете использовать свой Map, чтобы нарисовать свой предмет или получить свои собственные данные.

+0

-1: Это не отвечает на вопрос OP. '... Вы используете возвращаемое значение (из отфильтрованного списка) в качестве ключа на вашей карте ...' - Нет, нет, нет. * Значение * из отфильтрованного списка не является * ключом *. –

Смежные вопросы