AutoCompleteTextView getSelectedItemPosition

Мне нужно определить, какой элемент из адаптера был выбран пользователем (когда появляются выпадающие предложения).

Если пользователь выбирает элемент, я хочу получить либо:

  • позиция выбранного элемента - но мне нужна позиция относительно всех элементов в адаптере.
  • своего рода уникальный идентификатор выбранного элемента
  • если пользователь не выберет ни одно из моих предложений и не введет свой собственный текст, я просто получу ноль или -1 или что-то в этом роде.

Возможно ли это сделать с помощью AutoCompleteTextView?

Пример:

У меня есть стандартный ArrayAdapter для моего AutoCompleteTextView со следующими элементами:

{"one","one2","two","two2", "three", "three2"}

Пользователь вводит

через

ему предлагается 2 варианта:

три, три2

Затем он выбирает «три2». Когда запускается OnItemSelected, для параметра position устанавливается значение 1, потому что было всего 2 предложения.

Однако я хотел получить позицию 5, потому что у моего адаптера всего 6 элементов.


person hendrix    schedule 29.10.2012    source источник


Ответы (2)


вот что я сделал для аналогичной проблемы.

У меня есть адаптер для установки текстового представления автозаполнения.

вот мой файл PlacesAutoCompleteAdapter.java

package com.inukshk.adapter;

import java.util.ArrayList;

import android.content.Context;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;

import com.inukshk.CreateInukshk.CreateInukshk;

public class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements
        Filterable {
    private ArrayList<String> resultList;

    public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) {
        super(context, textViewResourceId);
    }

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

    @Override
    public String getItem(int index) {
        return resultList.get(index);
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults filterResults = new FilterResults();
                if (constraint != null) {
                    // Retrieve the autocomplete results.

                    resultList = CreateInukshk.autocomplete(constraint
                            .toString());

                    // Assign the data to the FilterResults
                    filterResults.values = resultList;
                    filterResults.count = resultList.size();
                }
                return filterResults;
            }

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

здесь я использовал resultList = CreateInukshk.autocomplete(constraint .toString());, который является моим методом, который возвращает список массивов, который я хочу отобразить.

и, наконец, вот мой код в основном java-файле, где я инициализировал наш AutoCompleteTextview.

Внутри OnCreate();

autoCompView = (AutoCompleteTextView) findViewById(R.id.editloc);
        autoCompView.setAdapter(new PlacesAutoCompleteAdapter(this,
                R.layout.list_item));
        // autoCompView.setOnItemClickListener(CreateInukshk.this);

        autoCompView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                            // here you can get value of arg2 as your position while selecting value.
                // Place = autoCompView.getText().toString();
                new AsyncGetAutoPlace().execute(autoCompView.getText()
                        .toString().trim());
            }
        });

вместо new AsyncGetAutoPlace().execute(autoCompView.getText() .toString().trim()); вы можете добавить свой код, что хотите.

Надеюсь, это поможет вам.

person Bhavesh Patadiya    schedule 29.10.2012

Вы пытались установить OnItemSelectedListener

person Rafael T    schedule 29.10.2012
comment
да я пробовал. Причина, по которой это не работает для меня, заключается в том, что она возвращает выбранную позицию только по отношению к предлагаемым в настоящее время элементам. Это означает, что если пользователю предлагается 2 элемента и он выбирает первый, он возвращает 0 в качестве позиции, а должен возвращать, например, 24, потому что в адаптере 40 элементов. - person hendrix; 29.10.2012
comment
должно быть что-то не так внутри вашей реализации адаптера. Мои адаптеры имеют то же количество элементов, что и предлагаемое количество. Подтвердили ли вы, что если ваше автозаполнение предложит 2 элемента, то getCount() от адаптера возвращает, то есть 40? Если это так, опубликуйте соответствующие части вашего адаптера. - person Rafael T; 29.10.2012