所以,我有两个调整器,我们先调用第一个微调器Parent(account_type_spinner)和第二个微调器Child(account_name_spinner)。请在下面的代码注意到一个ArrayAdapter初始化为儿童(account_name_spinner),我喂养它,我下面的代码行前在过去查询帐户名称的字符串数组(account_name_array):Android基于“Parent”微调器的选择更新微调器 - .notifyDataSetChange()没有触发?
//---define spinner objects as variables, assign adapters and listeners---
account_type_spinner = (Spinner) findViewById(R.id.account_type_spinner);
account_type_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, account_type_array);
account_type_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
account_type_spinner.setAdapter(account_type_adapter);
account_type_spinner.setOnItemSelectedListener(new SpinnerSelectionListener());
account_name_spinner = (Spinner) findViewById(R.id.account_name_spinner);
account_name_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, account_name_array);
account_name_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
account_name_spinner.setAdapter(account_name_adapter);
选择在父微调控制器触发我的“SpinnerSelectionListener”,它只是我的类实现OnItemSelectedListener。这每一个选择是在父微调提出时间类火灾明显,代码如下所示:
public class SpinnerSelectionListener implements OnItemSelectedListener {
public void onItemSelected(AdapterView<?> parent,
View view, int pos, long id) {
String spinner_selection = parent.getItemAtPosition(pos).toString();
if(spinner_selection.contentEquals(INCOME)) {
//---grab Income type accounts from db and build array---
db.open();
account_name_array = db.getAccounts(INCOME);
account_name_adapter.notifyDataSetChanged();
dr_amount_textview.setVisibility(View.GONE);
dr_amount.setVisibility(View.GONE);
cr_amount_textview.setVisibility(View.VISIBLE);
cr_amount.setVisibility(View.VISIBLE);
db.close();
} else {
//---grab Expense type accounts from db and build array---
db.open();
account_name_array = db.getAccounts(EXPENSE);
account_name_adapter.notifyDataSetChanged();
cr_amount_textview.setVisibility(View.GONE);
cr_amount.setVisibility(View.GONE);
dr_amount_textview.setVisibility(View.VISIBLE);
dr_amount.setVisibility(View.VISIBLE);
db.close();
}
}
public void onNothingSelected(AdapterView<?> parent) {
// Do nothing.
}
}
上面的代码应该更新的儿童(account_name_spinner)与收入或支出账户,只要从父母的选择变化收入费用,反之亦然(这是一个会计应用程序)。 “儿童的微调列表”的更新应该通过“account_name_adapter.notifyDataSetChanged();”然而没有发生。
我在StackOverflow上进一步研究了这个问题,发现在列表更新之前,我必须从我的Child's ArrayAdapter(account_name_adapter)中清除()或.remove()项目,但是,当我尝试“account_name_adapter.clear );”在通知ArrayAdapter之前,我得到一个操作是非法的错误。任何想法我做错了什么?
你真的必须创建并重新分配新的适配器吗?我很惊讶我无法更改数据并通知原来的适配器,你知道这是为什么吗? – AutoM8R
我几天前在寻找同样的东西,发现只有改编的解决方案。我知道,我也很惊讶...... – BrainCrash
答案接受,谢谢你,我永远不会拿出这个在我自己的。非常非常惊讶的是这种情况。事实上,我相信我昨天在其他地方看到了这一点,我完全认为这是错误的。所以,如果你正在看这个答案,并认为它是假的,那不是不幸的。 – AutoM8R