【问题标题】:Store ids in spinner control在微调控件中存储 id
【发布时间】:2015-04-28 07:23:37
【问题描述】:

我有微调控件和数据项使用 ormlite 从 sqlite 绑定,这种方式:

 public void addItemsOnSpinner()
    {
        DatabaseManager.init(this);

        spinner = (Spinner) findViewById(R.id.spinner2);
        List list = new ArrayList();

        List<Countries> cList = DatabaseManager.getInstance().getAllCountry();


        for (Countries c : cList)
        {
            list.add(c.getcName());

        }
        ArrayAdapter dataAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);
    }

所以基本上,国家名称被设置为我的微调控件的项目。它可以工作,但是我对此并不满意,因为我只能通过在微调器中选择的标签来确定当前选择。显然,这不好,因为国家名称不能保证是唯一的(它只是用于教育目的的简单应用程序)。

最好的解决方案是在我的微调器中存储国家名称(作为用户可见的微调器标签)和相应的记录 ID。 id 是自动生成的值,当然它是唯一的,因此它可以用于确定选择并从数据库中读取所有其他属性,使用 id 值,或编辑选择的记录并将新信息保存到数据库。

我知道如何通过 id 读取/编辑记录。但我不知道如何在我的微调器中存储相应的记录 ID,以了解实际选择了哪个项目以及如何查询数据库。

有什么想法吗?

我的微调控件声明为:

<Spinner
        android:id="@+id/spinner2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:prompt="@string/select2" />

我添加了存储 id 作为标签,所以:

List list = new ArrayList();
        List ids = new ArrayList();

        List<Countries> cList = DatabaseManager.getInstance().getAllCountry();


        for (Countries c : cList)
        {
            list.add(c.getcName());
            ids.add(c.getcID());

        }
        ArrayAdapter dataAdapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(dataAdapter);
        spinner.setTag(ids);

这样好吗?另外-如何获取当前选择标签?要获取我使用的当前项目:String.valueOf(spinner.getSelectedItem()) 但如何读取当前标签以获取我的 id?

【问题讨论】:

  • 您可以使用List&lt;countryObject&gt; 存储与国家/地区相关的额外值。但是你必须使用custom adapter 作为微调器。
  • 任何示例如何做到这一点?
  • @Paritosh 也提出了一个非常好的解决方案。或者你可以使用我的方式,但是它不是很优雅。
  • @"如何读取当前标签以获取我的 id" 我已经在我的答案中发布了它。请第二个代码sn-p。
  • 谢谢,我错过了。

标签: java android ormlite


【解决方案1】:

您可以在Spinner 的标签中存储记录ID。做这样的事情:

int[] recordIds = new int[5];
//init recordIds array
spinner.setTag(recordIds);

您可以针对这样的国家/地区获取 id:

int[] recordIds = (int[]) spinner.getTag();
int recordIdOfselectedItem = recordIds[spinner.getSelectedItemPosition()];

如您所见,country 的索引 n 映射到 recordId 的索引 n

【讨论】:

  • 我读了你的评论。我也有同样的问题。即使您使用的是setTag(),它也不会直接映射到该记录的id。对吗?
  • 嗯,为什么不呢?如果提供的国家/地区列表和记录 id 列表基本上代表针对 0、1、2、... n 的相同条目,那么就可以了。
  • 如果中间的某个记录是表中的deleted,它将中断。现在代码在删除id位置后会指向错误的ids
  • @Paritosh OP 没有提到这样的功能。
  • 从数据库中删除项目然后再次将所有值绑定到下拉列表中还不够吗?所有旧项目数据都将替换为当前数据,包括 ids
【解决方案2】:

您可以简单地创建带有名称和 ID 作为属性的“国家/地区”自定义模型。将此自定义国家/地区列表绑定到您的微调器。请查看此链接binding custom objects to spinner

【讨论】:

  • 谢谢,我会检查这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 2012-02-09
相关资源
最近更新 更多