【问题标题】:Second Spinner not receiving the proper info based on the first Spinner's selection根据第一个 Spinner 的选择,第二个 Spinner 没有收到正确的信息
【发布时间】:2013-03-15 00:22:57
【问题描述】:

我知道已经有大约一百万个主题,但请听我说完。

标题说明了一切,当我在微调器 1 中选择一个项目时,微调器 2 会获得一个特定的选项列表以供选择(然后将用于显示信息)。它本质上是一个小型通讯录。

*更新** 一切已修复且正常工作,特别感谢用户 FishTruck 的帮助(即让它工作!)

package com.your.package.name;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;

public class Contact extends Activity{

        public Spinner spinner1, spinner2;
        public Button btnSubmit;//not needed yet

        @Override
        public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);

                setContentView(R.layout.contact);
                findViews();
                addItemsOnSpinner1();
                addItemsOnSpinner2(0);
        }

        private void findViews(){
                spinner1 = (Spinner) findViewById(R.id.spinner1);
                spinner2 = (Spinner) findViewById(R.id.spinner2);
        }

        private void addItemsOnSpinner1() {
                List<String> list = new ArrayList<String>();

                list.add("Please Select");
                list.add("Choice 1");
                list.add("choice 2");

                ArrayAdapter<String> name = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);  

                name.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

                spinner1.setAdapter(name);
                spinner1.setOnItemSelectedListener(new OnItemSelectedListener(){
                        @Override
                        public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {
                                if(arg2>0)
                                addItemsOnSpinner2(arg2);
                        }
                        @Override
                        public void onNothingSelected(AdapterView<?> arg0) {
                                addItemsOnSpinner2(0);
                        }}
                );
        }

        private void addItemsOnSpinner2(int selectedIndex) {

                int positionTop = selectedIndex;

                if(positionTop==0){
                        List<String> list = new ArrayList<String>();
                        list.add("Please Select");
                        ArrayAdapter<String> name0 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list);
                        name0.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spinner2.setAdapter(name0);
                }else if(positionTop==1){
                        List<String> list1 = new ArrayList<String>();
                        list1.add("Please Select");
                        list1.add("item 1");
                        list1.add("item 2");
                        ArrayAdapter<String> name1 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list1);
                        name1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spinner2.setAdapter(name1);
                }else if(positionTop==2){
                        List<String> list2 = new ArrayList<String>();
                        list2.add("Please Select");
                        list2.add("item 3");
                        list2.add("item 4");
                        ArrayAdapter<String> name2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list2);
                        name2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spinner2.setAdapter(name2);
                }
        }

}

希望这会有所帮助!

【问题讨论】:

  • 看看我的答案。我想这会解决你的问题 inshallah。如果它确实将其标记为答案

标签: android spinner populate


【解决方案1】:

当第一个微调项被选中时,您需要调用addItemsOnSpinner2() 函数。

public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
    long arg3) {
addItemsOnSpinner2();}

【讨论】:

  • 嗨,Nezam,感谢您的快速回复,我按照您的建议做了,但现在第二个微调器完全是空的。我是否也必须移动方法 addItemsOnSpinner2{ }?或者它在哪里可以吗?
【解决方案2】:

是的,正如我之前的先生们所说的那样。

为了让第二个微调器获得正确的索引来设置列表,

您需要在单击第一个微调器后填充它。

/* 错误答案已删除 */

如果这是我的代码,我会将 addItemsOnSpinner2() 更改为:

private void addItemsOnSpinner2(int selectedIndex){
    int positionTop = selectedIndex;
    //rest is the same
    /* ... */
}

然后再次将这些插入到 addItemsOnSpinner1() 中:

spinner1.setOnItemSelectedListener(new OnItemSelectedListener(){
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {
            if(arg2>0)
            addItemsOnSpinner2(arg2);
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
            addItemsOnSpinner2(0);
        }}
    );

我就是这么干的

我认为这里有很多方法

edit2:oh 并将 onCreate() 中的 addItemsOnSpinner2() 编辑成 addItemsOnSpinner2(0)

edit3:你需要在onCreate()中调用addItemsOnSpinner2(),否则你的spinner是空的!

edit4:对不起,我犯了一个巨大的错误,以为可以在这里应用 onItemClickListener,真丢脸 :((

顺便说一句,如果你想保留索引(在屏幕方向改变或回到前台的情况下),它需要更复杂的工作

但这里有一个更简单的方法:

1.设置一个全局静态变量:int selectedIndex;

2.在onCreate中,如果savedInstanceState为null,则设置selectedIndex为0

3.在onCreate中,saveInstanceState为nullcheckd后,调用addItemsOnSpinner2(selectedIndex)

4.在 spinner1 的监听器中,设置 selectedIndex 为选中的索引。

虽然不能保证在每台机器上都能工作:(

【讨论】:

  • 您好 FishTruck,谢谢您的回复,我正在尝试这个,如果它有效,我会告诉您。谢谢!
  • 嗨,你知道任何粘贴和分享网站吗?我可以通过重新排列你的 code.edit:nvm 我找到 pastebin 来给你一些建议:D
  • 您好,FishTruck,我的更改一定是错误的,因为无论我尝试什么,应用程序仍然显示错误。
  • 对不起,我的错误,我认为 onitemclicklistener 可以用在微调器上。逻辑是一样的,但我们必须使用其他监听器:P
  • 对不起老兄,感谢指出我的无知,这是工作代码pastebin.com/Nz5LcfxV
【解决方案3】:

您在代码的开头(在 onCreate 中)设置了两个微调器。您应该在 spinner1 数据更改后填充第二个微调器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多