Android AutoCompleteTextView с данными из веб-службы, проблемы с отображением списка предложений - PullRequest
6 голосов
/ 08 февраля 2012

проблема, которую я не могу решить.

Что я хочу достичь: Отобразить предложения в AutoCompleteTextView, исходящие из вызова веб-службы. Конечный результат должен выглядеть так:

enter image description here

Что я сделал до сих пор:

В моем макете у меня есть AutoCompleteTextView, как это

 <AutoCompleteTextView
            android:id="@+id/txtAutoSearch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:selectAllOnFocus="true"
            android:singleLine="true" />

В моей деятельности у меня есть это:

 autoCompleteAdapter = new AdapterAutoComplete(context, ????? what should I have here?????, null);
         autoCompleteAdapter.setNotifyOnChange(true);
         txtAutoSearch.setAdapter(autoCompleteAdapter);
            txtAutoSearch.addTextChangedListener(new TextWatcher() {

                private boolean shouldAutoComplete = true;

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    shouldAutoComplete = true;

                }

                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }

                @Override
                public void afterTextChanged(Editable s) {
                    if (shouldAutoComplete) {
                       new GetAutoSuggestionsTask().execute(s.toString());
                    }
                }

            });

AsyncTask довольно прост, onPostExecute Я установил адаптер с данными, возвращаемыми из веб-службы

autoCompleteAdapter = new AdapterAutoComplete(context, ????? what should I have here?????,result);
txtAutoSearch.setAdapter(autoCompleteAdapter);

Адаптер выглядит так:

public class AdapterAutoComplete  extends ArrayAdapter<Person> {

    private Activity activity;
    private List<Person> lstPersons;
    private static LayoutInflater inflater = null;

    public AdapterAutoComplete(Activity a, int textViewResourceId, List<Person> lst) {
        super(a, textViewResourceId, lst);
        activity = a;
        lstPersons = lst;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return lstPersons.size();
    }

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

    public Person getCurrentPerson(int position) {
        return lstPersons.get(position);
    }

    public void removeItem(int position) {
        lstPersons.remove(position);
    }

    public static class ViewHolder {
        public TextView txtName;
        public TextView txtProfession;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        ViewHolder holder;
        if (convertView == null) {
            vi = inflater.inflate(R.layout.people_list_item, null);
            Utils.overrideFonts(activity, vi);

            holder = new ViewHolder();
            holder.txtName = (TextView) vi.findViewById(R.id.txtName);
            holder.txtProfession = (TextView) vi.findViewById(R.id.txtProfession);

            vi.setTag(holder);
        } else {
            holder = (ViewHolder) vi.getTag();
        }

        Person o = lstPersons.get(position);

        if (o.name != null) {
            holder.txtName.setText(o.name);
        } else {
            holder.txtName.setText("N/A");
        }

        if (o.profession != null) {
            holder.txtProfession.setText(o.profession);
        } else {
            holder.txtProfession.setText("N/A");
        }
        return vi;
    }
}

Что на самом деле происходит:

  • веб-сервис возвращает нужный мне список, поэтому данные доступны
  • в адаптере getView, похоже, не работает, поэтому я думаю, что-то не так сделано в нем.
  • нет списка предложений с моими значениями
  • Понятия не имею, что мне нужно для конструктора адаптера, для textViewResourceId. Что я делаю неправильно? Я застрял, пожалуйста, помогите.

Ответы [ 2 ]

7 голосов
/ 08 февраля 2012

После быстрого просмотра документации вы видите, что вы на правильном пути.

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

Из этого списка результатов вам нужно построить и заполнить адаптер: ваш пользовательский адаптер должен расширить ListAdapter & Filterable (как описано в setAdapter () документация).

После того, как у вас есть адаптер, все будет просто:1014 * getView () должен вызываться, когда адаптер имеет:

  • Изменено с помощью setAdapter ()
  • .notifyDataSetChanged() было вызвано в ListView.

Если два вышеупомянутых события не вызывают новых getView() s. Вы должны убедиться, что методы getCount() и getItem() возвращают правильные значения.

0 голосов
/ 15 февраля 2012

На самом деле, в конце концов, я выбрал этот маршрут , а в runQueryOnBackground я просто позвонил в свой веб-сервис и создал Matrix Cursor с необходимыми полями. Я знаю ... не лучшее решение, но работает в моем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...