AutoCompleteTextView return 可以一个ID吗?

Can AutoCompleteTextView return an ID?

AutoCompleteTextView 允许用户从有效值列表中选择一个字符串。就像,我想,每个想要使用这个 yoke 的开发人员,我对用户选择的 id 比它的字符串标签更感兴趣。有什么方法可以检索所选对象的 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;
    }
}

这里的 searchText 是一个 Autocompletetextview..

searchText.setOnItemClickListener(new OnItemClickListener() 
        {

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

                int position = position;     //Adapter selection position

            }

        });

一旦您初始化了适配器并过度点击了项目,您需要做的就是在您点击的项目的特定位置从适配器获取特定对象。 在 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;

但我建议,如果您可以创建一个 class 扩展基本适配器,那么您将重写方法 GetView 并可以轻松地完成您正在寻找的事情。你的构造函数可以像这样开始,

List<SomeObjects> items;
Activity context;

public CustomAdapter(Activity context, List<SomeObjects> items)
        : base()
    {
        this.context = context;
        this.items = items;
    } 

Ankush 的回答有效。我在这里发布 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);
    }
}