首页 > 解决方案 > Spinner 如何更改数据

问题描述

我的项目中最初有 2 个微调器。当第一个微调器值更改时,我想更改第二个微调器的数据。这是我尝试过的。

Spinner subscription = findViewById(R.id.spinner_subscription);
    items_subscription = new String[]{"Daily"};
    ArrayAdapter<String> adapter_subscriptions = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, items_subscription);
    subscription.setAdapter(adapter_subscriptions);

    payment_method.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(position == 0){
                items_subscription = new String[]{"Daily"};
            }else if(position == 1){
                items_subscription = new String[]{"Monthly", "Annually"};
            }else if(position == 2){
                items_subscription = new String[]{"Monthly", "Annually"};
            }else{
                items_subscription = new String[]{"Daily"};
            }

            adapter_subscriptions.notifyDataSetChanged();
            subscription.setAdapter(adapter_subscriptions);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

上面的方法不起作用。它只在加载时广告“每日”,当 Spinner1 值发生变化时,spinner2 值不会改变。我怎样才能实现以下目标?

标签: javaandroid

解决方案


items_subscription发生这种情况是因为您在 inside 重新分配适配器时更改了对适配器数组的引用onItemSelected,现在您adapter_subscriptions没有与数组相同的对象,并且您正在修改适配器不知道的数据。最好有一个数组列表,清除它,并在更改时用新数据填充它,然后调用adapter.notifyDataSetChanged().

ArrayList<String> items_subscription = new ArrayList<>();
// add your objects to the list and initialize the adapter
// ...
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    items_subscription.clear();
    if(position == 0){
        items_subscription.add("Daily");
    }
    // ...etc

    adapter_subscriptions.notifyDataSetChanged();
}

推荐阅读