【问题标题】:What does GetItemIdAtPosition in MonoDroid return?MonoDroid 中的 GetItemIdAtPosition 返回什么?
【发布时间】:2012-04-03 23:51:17
【问题描述】:

我在网上找不到该功能的任何文档,Google 甚至没有发现任何有用的东西。我试图找到原始代码但失败了:)(我怀疑我是否能理解它。)所以有人知道这个函数实际上是做什么的吗?它返回什么“项目 ID”?

我认为如果GetItemAtPosition 返回项目中包含的字符串,GetItemIdAtPosition 可能会返回“名称”属性的内容。但和往常一样,这并不像预期的那样。

我使用了基于此的微调器:

<string-array name="choices">
    <item>Choose action</item>
    <item name="3">Back to 3</item>
    <item name="2">Back to 2</item>
</string-array>

从微调器中选择选项时使用 toast 进行输出:

private void choice_callback (object sender, ItemEventArgs e) {
    Spinner spinner = (Spinner)sender;
    string toast = string.Format ("Chosen action: {0} at pos {1} ID {2}", 
        spinner.GetItemAtPosition (e.Position), 
        e.Position, 
        spinner.GetItemIdAtPosition(e.Position));
    Toast.MakeText (this, toast, ToastLength.Short).Show ();
}

输出“Chosen action: Back to 3 at pos 1 ID 1”等;也就是说spinner.GetItemIdAtPosition(e.Position) 的返回似乎和e.Position 本身是一样的。

旁注:该应用程序基于此微调器教程:http://docs.xamarin.com/android/tutorials/User_Interface/spinner。我只采用了您可以在上面看到的位来尝试查看下拉列表中的项目是否可以通过它们的位置以外的方式来识别。

【问题讨论】:

    标签: android event-handling xamarin.android arrays


    【解决方案1】:

    它返回适配器的GetItemId(int position) 返回的值。这是一个显示如何的示例。它基于http://docs.xamarin.com/android/tutorials/User_Interface/spinner 教程:

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
    
        SetContentView(Resource.Layout.Main);
    
        Spinner spinner = FindViewById<Spinner>(Resource.Id.spinner);
    
        spinner.ItemSelected += SpinnerItemSelected;
        spinner.Adapter =
            new MyAdapter(this, Android.Resource.Layout.SimpleSpinnerItem,
                Resources.GetStringArray(Resource.Array.planets_array));
    }
    
    private void SpinnerItemSelected(object sender, ItemEventArgs e)
    {
        Spinner spinner = (Spinner) sender;
        string toast = string.Format("The planet is {0}",
            spinner.GetItemIdAtPosition(e.Position));
        Toast.MakeText(this, toast, ToastLength.Long).Show();
    }
    
    public class MyAdapter : ArrayAdapter
    {
        private int[] _newIds = new[] {9, 7, 5, 3, 1, 8, 6, 4, 2};
    
        public MyAdapter(Context context, int textViewResourceId, object[] objects)
            : base(context, textViewResourceId, objects)
        {
        }
    
        public override long GetItemId(int position)
        {
            return _newIds[position];
        }
    }
    

    发生的情况是,当您选择一个项目时,它会显示适配器返回的值。在这个例子中,我为每个位置使用了随机值。 如果选择第二项,则返回_newIds数组中第二个位置的值,即7。

    【讨论】:

    • 非常感谢,有道理!您是否碰巧知道 ID 值通常来自哪里?我想现在我会尝试一下,看看我是否可以使用您的示例来提取“名称”值或类似的东西。
    • 如果您使用ArrayAdapter.CreateFromResource( ... ) 方法获取适配器,我认为它使用位置作为id - 位置0 的项目ID 为0,项目1 的ID 为1。我认为所有的适配器执行此操作。也许其他人可以发表评论?
    • 如果查看 ArrayAdapter 的代码,可以看到 getItemId() 方法只是返回位置:github.com/android/platform_frameworks_base/blob/master/core/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2017-07-23
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多