2011-08-01 91 views
3

所以,我有两个调整器,我们先调用第一个微调器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之前,我得到一个操作是非法的错误。任何想法我做错了什么?

回答

1

您只需重新分配适配器你有更新的阵列(account_name_array)

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); 

后编辑:适配器,你不及格的参考,所以当你更新数组适配器仍然有相同的数据。调用.notifyDataSetChanged()不会使用新数组更新适配器。

+0

你真的必须创建并重新分配新的适配器吗?我很惊讶我无法更改数据并通知原来的适配器,你知道这是为什么吗? – AutoM8R

+0

我几天前在寻找同样的东西,发现只有改编的解决方案。我知道,我也很惊讶...... – BrainCrash

+0

答案接受,谢谢你,我永远不会拿出这个在我自己的。非常非常惊讶的是这种情况。事实上,我相信我昨天在其他地方看到了这一点,我完全认为这是错误的。所以,如果你正在看这个答案,并认为它是假的,那不是不幸的。 – AutoM8R