【问题标题】:Android: value of one spinner depends on value of other spinnerAndroid:一个微调器的值取决于其他微调器的值
【发布时间】:2012-01-30 12:56:15
【问题描述】:

我在使用 Android Spinner 时遇到问题。在我的应用程序中,我在主布局上创建了两个 Spinner。 “州”微调器和“区”微调器。 Spinner 上的所有数据都存储在 SQLite 数据库中。我想根据第一个微调器中特定“状态”的选择在第二个微调器上显示“区”列表。 示例:假设当我在第一个微调器中选择卡纳塔克邦时,应用程序首先从 SQLite 数据库中检索与卡纳塔克邦相关的所有地区,然后显示在第二个微调器上。

为此,我正确执行所有数据库活动意味着创建两个表“州”和“区”,其中区表中的一列是外键,它被引用到“州表”的主键之一

db.execSQL("create table "+STATE_TABLE+" ("+
            STATE_ID+" integer primary key autoincrement not null, "+
                STATE_NAME+" text"+")");

    db.execSQL("create table "+DISTRICT_TABLE+" ("+DISTRICT_ID+
            " integer primary key autoincrement not null,"+DISTRICT_NAME
                +" text,"+STATE_ID+" integer, FOREIGN KEY("
                    +STATE_ID+") REFERENCES "+STATE_TABLE
                        +"("+STATE_ID+")"+")");

现在在 Activity 类中:

spinnerState = (Spinner)findViewById(R.id.spinner1);
spinnerDistrict = (Spinner)findViewById(R.id.spinner2);
stateList = new ArrayList<String>();
districtList = new ArrayList<String>();

假设所有数据都准备好存储在数据库中。

现在我需要从数据库中检索所有“状态”数据并将其添加到状态列表中,即 ArrayList。

Cursor stateCursor = database.query(STATE_TABLE, new String[]{STATE_ID, STATE_NAME},
            null, null, null, null, STATE_NAME);
    stateCursor.moveToFirst();

    if(! stateCursor.isAfterLast()){
        do{
            int id = stateCursor.getInt(0);
            String stateName = stateCursor.getString(1);
            stateList.add(stateName);
        }while(stateCursor.moveToNext());
    }
    stateCursor.close();

在此之后我创建一个 ArrayAdapter 并将这个状态列表放入其中。

spinnerState.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, stateList));

接下来我将以下代码放入活动类中:

spinnerState.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View v,
                int pos, long id) {

        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            // TODO Auto-generated method stub
        }
    });

现在我的问题来了:

  1. 我如何获取 StateId 以执行选择查询以获取数据库中与特定州相关的所有地区。
  2. 适配器将如何为 District 生成。
  3. 我将所有这些代码放在哪里。

从状态 Spinner 获取值后,我需要创建 DistrictList。

在本网站前面提出的类似问题,他们做了什么: 他们已经为两个微调器创建了两个适配器,然后应用 setOnItemSelectedListener。 请帮助我,因为在这里我的思想完全停止工作。 我参考了很多书籍和网站,但他们甚至没有提到这类问题。

【问题讨论】:

    标签: android database spinner adapter


    【解决方案1】:

    我在这里看到了几个解决方案:

    选项 1:

    不要将stateList 声明为ArrayList&lt;String&gt;,而是创建一个自定义POJO StateInfo 并将stateList 指定为ArrayList&lt;StateInfo&gt;

    public class StateList {
        private int id;
        private String stateName;
    
        //Constructors, getters and setters
    }
    

    那么,

    if(! stateCursor.isAfterLast()){
        do{
            int id = stateCursor.getInt(0);
            String stateName = stateCursor.getString(1);
            stateList.add(new StateInfo(id, stateName));
        }while(stateCursor.moveToNext());
    }
    

    现在,你可以这样做了:

    public void onItemSelected(AdapterView<?> parent, View v,
            int pos, long id) {
        int id = stateList.get(pos).getId();
        //Use This ID to construct your next SQLite query; and populate the district spinner.
    }
    

    如果你这样做,你将不得不创建一个自定义的ArrayAdapter 并实现getView() 方法。查看 Android 文档了解如何执行此操作。

    选项 2:

    为什么还需要 stateID?我想您可以编写一个查询来获取仅给定州名称的地区列表。在这种情况下,您可以将stateList 保留为ArrayList&lt;String&gt;,甚至根本不需要StateInfo 类。只需这样做:

    public void onItemSelected(AdapterView<?> parent, View v,
            int pos, long id) {
        String stateName = stateList.get(pos);
        //Use this name to construct your next SQLite query; and populate the district spinner.
    }
    

    【讨论】:

    • 另外,因为一个州的地区列表在程序执行期间不会改变;您可以在程序启动时异步预加载&lt;stateName, districtList&gt;HahMap(每个状态一个);或者至少在第一次获取时缓存值。如果这样做,则在选择一种状态时不需要进行额外的查询;你可以直接在onItemSelected()中查看HashMap
    • 感谢您的快速回复。但我无法为显示区的第二个微调器编写代码。所以请指定我区微调器的完整代码。
    • 你在哪里卡住了?你能写查询吗?它是否按预期返回区域的光标?请提供更详细的信息,以便我们为您提供帮助。
    • 你是怎么解决这个问题的?如果这里的任何答案对您有所帮助,您应该投票或接受它。如果没有,那么在这里分享您的解决方案是一个好习惯:)
    【解决方案2】:

    对于问题 1:

    您只需要跟踪用户选择进入微调器的状态,并根据其位置,您必须找到其相关的 id。然后您可以相应地查询区域。显然您必须使用该微调器的 onItemSelectedListener 来获取所选状态的位置。

    对于问题 2:

    您需要在辅助类中创建一个方法,该方法接受 stateId(您将按照我上面所说的计算)并根据字符串数组中的区域名称返回您。因此,在您的主要活动中,在状态微调器的 onItemSelectedListener 中,您将不得不抓取该字符串数组并为其准备一个适配器。在那里,您必须将适配器设置为您的地区微调器。

    这将始终使用用户在状态数组中选择的内容更新您的地区微调器。

    对于问题 3:

    几乎所有代码都在您的状态微调器的 onItemSelectedListener 中。只有一个获取相关地区名称的方法将在您的帮助器类中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多