2012-05-08 64 views
0

我试图让几个spinners基于他们以前的微调选择动态改变。我可以更新列表,但是当我使用adapter.clear()时,它会崩溃。这里是我的代码:adapter.clear()崩溃android应用

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.Spinner; 
import android.widget.TextView; 

public class CarKitsAct extends Activity{ 

    ArrayAdapter<String> adMod, adEd; 
    String[] models, edition; 
    Boolean initSpMan = true; 
    Boolean initSpMod = true; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.carkitslayout); 

    // Construct TextViews 
     TextView textMan = (TextView) findViewById(R.id.textMan); 
     textMan.setText(R.string.selectmanufacturer); 
     TextView textMod = (TextView) findViewById(R.id.textMod); 
     textMod.setText(R.string.selectmodel); 
     TextView textEd = (TextView) findViewById(R.id.textEd); 
     textEd.setText(R.string.selectedition); 

    // Construct Spinners 
     Spinner spMan = (Spinner) findViewById(R.id.spMan); 
     Spinner spMod = (Spinner) findViewById(R.id.spMod); 
     Spinner spEd = (Spinner) findViewById(R.id.spEd); 

    // Construct Manufacturer Spinner Adapter 
     ArrayAdapter<CharSequence> adMan; 
     adMan = ArrayAdapter.createFromResource(this, R.array.cars, android.R.layout.simple_spinner_item); 
     adMan.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     spMan.setAdapter(adMan); 

    // Set initial values for model and edition spinners 
     models = getResources().getStringArray(R.array.AC); 
     edition = getResources().getStringArray(R.array.ACAcceca); 

    //Construct adapters for models and editions 
     adMod = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, models); 
     adMod.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     adMod.setNotifyOnChange(true); 
     spMod.setAdapter(adMod); 

     adEd = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, edition); 
     adEd.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     adEd.setNotifyOnChange(true); 
     spEd.setAdapter(adEd); 

    // Set up listeners for item selection 
     spMan.setOnItemSelectedListener(new ManItemSelectedListener()); 
    } 

    public class ManItemSelectedListener implements OnItemSelectedListener { 
     public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
      if (initSpMan == true) { 
       initSpMan = false; 
      } else { 
       models = getResources().getStringArray(2130968577 + pos); 
       adMod.clear(); 
       adMod.addAll(models); 
       adMod.notifyDataSetChanged();    
      } 
    } 
     public void onNothingSelected(AdapterView<?> parent) {} 
    } 
} 

正如你可以看到我尝试使用一个布尔标志,以确定是否刚刚创建的微调或没有,但后来当我改变一个选择它死。

+1

安置自己的logcat的错误。一旦我们可以看到正在生成的错误,它将更容易诊断。 – Gophermofur

回答

4

你可能会得到一个UnsupportedOperationException,对不对?这是因为适配器会使用一组对象进行初始化,并将其整体转换为无法修改的AbstractList

要解决您的问题,您只需将实现List<?>接口的内容提供给适配器即可。例如:

String[] strings = getResources().getStringArray(R.array.cars); 
List<String> items = new ArrayList<String>(Arrays.asList(strings)); 
ArrayAdapter<String> adMan = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items); 
+0

由于不正确地使用泛型,您的示例将无法编译。 – asenovm

+0

谢谢。这实际上对我有用。 将声明更改为: 'String [] modStr,edStr; 列表模型,版本;' 和 'modStr = getResources()。getStringArray(R.array.AC); models = new ArrayList (Arrays.asList(modStr)); edStr = getResources()。getStringArray(R.array.ACAcceca); edition = new ArrayList (Arrays.asList(edStr));' and 'modStr = getResources()。getStringArray(2130968577 + pos); models = new ArrayList (Arrays.asList(modStr)); adMod.clear(); adMod.addAll(models); adMod.notifyDataSetChanged();' – jimmygoska

+1

@MartinAsenov:谢谢你指出。这就是你从复制粘贴并直接在浏览器中输入代码而不是IDE的结果。更正它。顺便下次,请随时自行解决这个问题。我的意思是,这就是整个编辑系统的用途,对吧? :) –

0

可疑,不敢相信你有和我几个小时前一样的问题。我已经报道了有关此错误:bug report

的问题是,当你传递一个数组构造它实际上调用其他构造函数重载接受一个列表,而不是与Arrays.asList(array)阵列。但是,此方法仅在返回数组上返回视图,因此将不允许向列表中添加和移除元素。如果您喜欢,可以在Android问题跟踪器中为错误报告加注星标。

您还可以查看一个ArrayAdapter类here的代码例如

+0

谢谢。出演。 – jimmygoska