2011-03-22 50 views
2

在我的活動中,我有一個微調器和一個ListView。微調器用於過濾ListView中的項目。當用戶點擊列表項時,會調用另一個活動,其中顯示了列表項的詳細信息。然後,從細節活動中,用戶按下後退按鈕,並且微調器(因此列表)被重置爲其初始值。當活動發生變化(生命週期相關)時,Android微調不保留價值

這是因爲我將填充微調器的適配器並將其onItemSelectedListener聲明爲onStart()方法,當用戶按下後退按鈕時會再次調用該方法。另外,onItemSelectedListener實際上是由onStart()方法調用的。

如何避免此行爲?我想我應該把監聽器和適配器移到其他地方,但是在哪裏?

這裏是類的概述

public static ArrayList<String> years; 

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

    // populate years array here 
} 

@Override 
protected void onStart() 
{ 
    super.onStart(); 

    Spinner spinner = (Spinner) findViewById(R.id.spinner_anni); 

    // create spinner adapter 
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, ArchiveActivity.years); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner.setAdapter(adapter); 

    // create spinner listener 
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
    { 
     @Override 
     public void onItemSelected(AdapterView<?> parentView, 
       View selectedItemView, int position, long id) 
     { 
      filterList(ArchiveActivity.years.get(position)); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parentView) 
     { 
      return; 
     } 
    }); 

    // create list listener 
    ListView list = (ListView) findViewById(R.id.list_archive); 
    list.setOnItemClickListener(this); 
} 

private void filterList(String year) 
{ 
    // filter list data here 
} 

@Override 
public void onItemClick(AdapterView<?> list, View item, int pos, long id) 
{ 
    // call detail activity for list item that's been pressed 
    Intent i = new Intent(this, DetailActivity.class); 
    startActivity(i); 
} 

回答

2

通常由您發起的微調器和onCreate()方法中的適配器。此外,您必須保存微調器的狀態,並在活動回到前臺時重新創建它。檢查this question關於如何保存應用程序狀態。

+0

但不會findViewById在onCreate()方法返回null? – Pimentoso 2011-03-22 10:34:53

+0

你的意思是'Spinner spinner =(Spinner)findViewById(R.id.spinner_anni); '?你如果把它叫做後精「的setContentView(R.layout.archive);」 – Flo 2011-03-22 10:56:02

+0

謝謝,這確實起作用。我實例在onCreate()方法的適配器和聽衆的的setContentView(後),全部是正確的與世界同步。 – Pimentoso 2011-03-23 10:00:47