Может ли AutoCompleteTextView вернуть идентификатор?

AutoCompleteTextView позволяет пользователям выбирать строку из списка допустимых значений. Как я полагаю, каждый разработчик, который хочет использовать это ярмо, меня гораздо больше интересует идентификатор выбора пользователя, чем его строковая метка. Есть ли способ получить свойство id выбранного объекта или его индекс в исходном массиве?

Следующий код C # позволяет пользователям выбирать из списка SomeObject. Я работаю в Xamarin, но пусть это вас не смущает. Исправьте мою проблему в java, и я с радостью заставлю ее работать на C #

public class AutoCompleteField : PhysicalField
{
    protected AutoCompleteTextView actv;
    public AutoCompleteField(IList<SomeObject> choices, LogicalField logical, string id)
        : base(logical, id) 
    {
        _choices = choices;
    }
    protected ArrayAdapter<SomeObject> _adapter;

    public override void addToView(LayoutInflater inflater)
    {
        var ctx = App_NotMobility.CurrentActivity;
        actv = new AutoCompleteTextView(ctx);
        actv.Id = _form.generateId();

        // test choices
        var _choices = new List<SomeObject>();
        _choices.Add(new SomeObject(234, "Oranges"));
        _choices.Add(new SomeObject(456, "Apples"));
        _choices.Add(new SomeObject(789, "Bananas"));

        _adapter = new ArrayAdapter<SomeObject>(ctx, Android.Resource.Layout.SimpleDropDownItem1Line, _choices);
        actv.Adapter = _adapter;
        actv.ItemClick += delegate(object sender, AdapterView.ItemClickEventArgs e)
        {
            // HOW DO I ACCESS THE ID OR THE INDEX OF USER'S SELECTION ?????????????????
        };
       _form.AddView(actv);  
    }
}
public class SomeObject
{
    public int Id { get; set; }
    public string Label { get; set; }
    public SomeObject(int id, string label)
    {
        Id = id;
        Label = label;
    }
    public override string ToString()
    {
        return Label;
    }
}

person bbsimonbb    schedule 12.10.2015    source источник
comment
см. android.widget.AdapterView.OnItemClickListener#onItemClick документацию   -  person pskink    schedule 12.10.2015
comment
Для этого вы можете использовать специальный адаптер. Впрочем, опубликовать пример для подробностей будет лучше :)   -  person BNK    schedule 12.10.2015
comment
Вопрос непонятный ..... обновите свой код пожалуйста   -  person Narendra Kumar    schedule 12.10.2015
comment
о каком Id вы говорите? и вставьте сюда свой код   -  person Aditya Vyas-Lakhan    schedule 12.10.2015
comment
Прочтите следующий stackoverflow.com/questions/33047156/   -  person BNK    schedule 12.10.2015
comment
Хорошо, я прочитал это, но мне непонятно, какую проблему это решает. Я понимаю, что в целом люди хотят, чтобы я реализовал собственный адаптер, но какой метод я могу переопределить и как получить доступ к идентификатору или индексу из этого метода?   -  person bbsimonbb    schedule 12.10.2015


Ответы (3)


После того, как вы инициализировали адаптер и перестарались с щелчком элемента, все, что вам нужно сделать, это получить конкретный объект из вашего адаптера в той конкретной позиции элемента, который вы щелкнули. В java это было бы похоже на:

@Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
SomeObject someObject = (SomeObject) adapter.getItem(position);
int id = someObject.getId();
}

Это все, что вам нужно. Я не уверен в вашем коде в xamarin, как вы получите позицию, потому что я не вижу никакого метода, где позиция является входной переменной, возможно, вы могли бы добавить тег в свое представление и получить тег в своем методе щелчка .

var position = ((View)sender).Tag;

Но я бы рекомендовал, если вы можете создать класс, расширяющий базовый адаптер, таким образом вы переопределите метод GetView и сможете легко делать то, что ищете. Ваш конструктор может быть таким для начала,

List<SomeObjects> items;
Activity context;

public CustomAdapter(Activity context, List<SomeObjects> items)
        : base()
    {
        this.context = context;
        this.items = items;
    } 
person Ankush Sharma    schedule 12.10.2015
comment
Я могу получить позицию из события, но это позиция в списке отфильтрованных. Если бы я мог обработать этот отфильтрованный список, моя проблема была бы решена. _adapter.Filter.FilterResults сделает это, согласно документам. Но, похоже, это недоступно в Xamarin. Не знаю про java. Как мне помогает расширение BaseAdapter? Это не фильтруемое событие. Что делает его метод GetView ()? - person bbsimonbb; 12.10.2015
comment
Расширяя базовый адаптер, в представлении получения вы можете назначить тег своему текстовому представлению. Таким образом, в вашем методе click у вас может быть этот тег, который будет служить вам в качестве позиции элемента, по которому вы щелкнули, и затем вы можете найти идентификатор объекта в своем объекте-держателе. - person Ankush Sharma; 12.10.2015
comment
Я думаю, что в getview вы также можете объявить свой метод click вместо самого класса активности. - person Ankush Sharma; 12.10.2015
comment
Что ж, это было болезненно и бесплодно. Чтобы дать себе все шансы, я произвел AutoCompleteTextView, а затем реализовал IOnItemClickListener в производном классе. Я охотился высоко и низко в parent, view, this и т. Д. Нигде я не могу найти след отфильтрованного массива объектов или выбранного объекта. Я даже не могу переопределить поведение по умолчанию, которое устанавливает текст TextView. Мой обработчик выполняется так же, как и по умолчанию, а не вместо него. Обработчик OnItemSelected никогда не запускается. Возможно, это ограничение xamarin, но поведение этого компонента, казалось бы, высечено в камне. - person bbsimonbb; 13.10.2015
comment
Хорошо, этот ответ работает, и я принимаю. Мне просто нужно было преобразовать адаптер, как показано в только что опубликованном коде C #. - person bbsimonbb; 13.10.2015
comment
Рад, что смог помочь :) - person Ankush Sharma; 13.10.2015

Ответ Анкуша сработал. Я публикую здесь код C #, потому что есть некоторые тонкости с приведением типов и обобщениями ...

public class myActv : AutoCompleteTextView, AdapterView.IOnItemClickListener
{
    PhysicalField _physical;
    public myActv(Activity ctx, PhysicalField physical) : base(ctx)
    {
        OnItemClickListener = this;
        _physical = physical;
    }

    public void OnItemClick(AdapterView parent, View view, int position, long id)
    {
         // This is the punchline...
         SomeObject whatIwant = ((ArrayAdapter<SomeObject>)this.Adapter).GetItem(position);
    }
}
person bbsimonbb    schedule 13.10.2015

Здесь searchText - это Autocompletetextview ..

searchText.setOnItemClickListener(new OnItemClickListener() 
        {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) 
            {

                int position = position;     //Adapter selection position

            }

        });
person Narendra Kumar    schedule 12.10.2015
comment
где он говорит о позиции? - person pskink; 12.10.2015
comment
позиция - это элемент, выбранный из раскрывающегося списка адаптера - person Narendra Kumar; 12.10.2015
comment
он не спрашивает о должности - person pskink; 12.10.2015
comment
я думаю, что название говорит само за себя - person pskink; 12.10.2015