【问题标题】:Can AutoCompleteTextView return an ID?AutoCompleteTextView 可以返回 ID 吗?
【发布时间】:2015-10-12 09:44:56
【问题描述】:

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

【问题讨论】:

  • 参见android.widget.AdapterView.OnItemClickListener#onItemClick 文档
  • 您可以为此使用自定义适配器。但是,发布一个示例以进行更多说明会更好:)
  • 问题不清楚.....请更新你的代码
  • 您说的是哪个?并在此处粘贴您的代码

标签: android autocompletetextview


【解决方案1】:

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

【讨论】:

  • 我可以从事件中得到位置,但它是 filtered 列表中的位置。如果我能处理这个过滤列表,我的问题就会得到解决。根据文档,_adapter.Filter.FilterResults 会这样做。但这似乎不适用于 Xamarin。不知道java。扩展 BaseAdapter 对我有什么帮助?它不是可过滤的事件。它的 GetView() 方法是做什么的?
  • 通过扩展基本适配器,在获取视图中,您可以为文本视图分配标签。这样,在您的 click 方法中,您可以使用该标签作为您单击的项目的位置,然后您可以在持有者对象中找到对象的 id。
  • 我认为在getview中你也可以声明你的click方法而不是在activity类本身中。
  • 这很痛苦,也没有结果。为了给自己每一个机会,我派生了 AutoCompleteTextView,然后在派生类中实现了 IOnItemClickListener。我在父级、视图、this 等中进行了高低搜索。我在任何地方都找不到过滤后的对象数组或所选对象的踪迹。我什至无法覆盖设置 TextView 文本的默认行为。我的处理程序与默认值一样执行,而不是代替。 OnItemSelected 处理程序似乎永远不会执行。也许这是一个 xamarin 限制,但该组件的行为似乎一成不变。
  • 好的,这个答案有效,我接受了。我只需要转换适配器,如我刚刚发布的 C# 代码所示。
【解决方案2】:

安库什的回答奏效了。我在这里发布 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);
    }
}

【讨论】:

    【解决方案3】:

    这里的 searchText 是一个 Autocompletetextview..

    searchText.setOnItemClickListener(new OnItemClickListener() 
            {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) 
                {
    
                    int position = position;     //Adapter selection position
    
                }
    
            });
    

    【讨论】:

    • 他在哪里谈论职位?
    • 位置是从适配器下拉列表中选择的项目
    • 他不是在问职位
    • 我认为标题说明了一切
    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2016-02-08
    • 2012-07-06
    • 2016-10-17
    • 2010-11-10
    相关资源
    最近更新 更多