【问题标题】:Dynamic Allocation of Array doesn't work for ArrayAdapter while assigning it for Spinner in Android在为 Android 中的 Spinner 分配数组时,数组的动态分配不适用于 ArrayAdapter
【发布时间】:2015-02-24 05:57:29
【问题描述】:

我在 Android 中创建 Spinner 小部件时确实遇到了问题。目标是用我将从源动态检索的数据填充 Spinner。 现在我可以创建一个带有在程序中隐式声明的数据源的微调器。但是,当我尝试从动态创建的数组中获取数据时,应用程序会抛出强制关闭。 我将在这里粘贴一些演示示例来解释我的问题!

String[] SSID = new String[15];
String[] Data = {"Captain","America","Hulk","Ironman","Thor"};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);




    button = (Button)findViewById(R.id.button);

    addDevDialogue = new Dialog(this);
    addDevDialogue.setContentView(R.layout.popup);

    concat();

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            dialogue();

        }
    });


}


public void concat()
{
    for(int i=0;i<5;i++)
    {
        SSID[i]=Data[i];

    }

}

public void dialogue()
{
    addDevDialogue.setTitle("Movies List");
    addDevDialogue.setCancelable(true);
    addDevDialogue.show();

    spinList2 = (Spinner)addDevDialogue.findViewById(R.id.spinner2);
    ArrayAdapter<String> listAdapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked, SSID);
    spinList2.setAdapter(listAdapter2);



}

当我尝试打开对话框时,上面的代码会引发错误。 我已经用预定义的数据源代替“SSID”尝试了相同的示例,这会产生无错误的输出!

我无法理解为什么当我将 'SSID[]' 数组定义到 ArrayAdapter 时它不起作用。 任何见解都会有所帮助!!!

【问题讨论】:

    标签: android android-arrayadapter android-spinner dialog


    【解决方案1】:

    在填充适配器之前调用 show() 调用

    addDevDialogue.show();
    

    之后

    spinList2.setAdapter(listAdapter2);
    

    更新:

    一旦改变 SSID 的大小

    String[] SSID = new String[Data.length];
    

    希望对你有帮助。

    【讨论】:

    • 嗯,我已经尝试了你提到的,但它仍然抛出一个错误!我已经用“Data []”而不是“SSID”尝试过这个......它似乎工作了!我认为问题出在 SSID 数组上,请您帮忙!
    • @SwarnanEel 一次创建 SSID 数组,数据数组大小如上。
    • 嗯,我试过了,还是报错!我要发布错误日志吗?
    • @SwarnanEel 为什么要将Data数组复制到SSID,可以在创建适配器时直接使用Data。
    • 是的好问题。其实这只是一个演示程序。实际实现是在另一个太长的程序上。 :) 在这个程序中解决这个问题将帮助我!无论如何,数组适配器上似乎有一个“ Fatal Exception: main java.lang.NullPointerException ”。你能看一下吗。这个问题快把我逼疯了!非常感谢您给我时间! :)
    【解决方案2】:

    您的字符串数组 String[] Data = {"Captain","America","Hulk","Ironman","Thor"}; 声明有 5 个元素(索引 0-4)

    在你的循环中你循环了 6 次

    public void concat()
    {
        for(int i=0;i<5;i++)
        {
            SSID[i]=Data[i];    
        }    
    }
    

    这可能会导致索引越界异常。把你的循环改成这个

    public void concat()
    {
        for(int i=0;i<4;i++)
        {
            SSID[i]=Data[i];
    
        }
    }
    

    【讨论】:

    • 不,我在数组中有 5 个数据,循环只运行 5 次。它从 0 运行到 4,因为 i hv 给定 i
    • 不,它没有。您的循环循环 6 次。 @Swarna nEel
    【解决方案3】:

    @swarna:您正在分配一个由 15 个元素组成的固定数组,然后只填充 5 个元素。数组适配器可能会被其他 10 个尚未初始化的元素绊倒。建议你让你的 SSID 数组只有 5 个元素,或者如果这是一个动态确定的值,你可以保留 ArrayList 并继续添加它。然后,在设置适配器时执行以下操作:

        YourObjList.add("one")
        YourObjList.add("two")
        YourObjList.add("three")
    
        String[] SSID = YourObjList.toArray(new YourObjList[YourObjList.size()]);
    
        ArrayAdapter<String> listAdapter2 = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_checked, SSID);
        spinList2.setAdapter(listAdapter2);
    

    这将允许可变列表大小。

    希望对你有帮助

    【讨论】:

    • 非常感谢您的回复!我已经解决了这个问题。是的,它在 SSID[] 数组上的最后 10 个空值中跳闸!
    猜你喜欢
    • 2020-03-06
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    相关资源
    最近更新 更多