2011-11-26 35 views
5

我有一個應用程序,它在遍歷文件系統(每個文件夾一個活動)時遞歸地創建一個活動的多個實例。在活動堆棧中向前移動時(即正常文件夾遍歷),我通過Intent檢索數據。當我從父文件夾到子文件夾時,應用程序運行良好。我遇到問題,因爲文件/文件夾的列表與之前的活動(孩子)保持不變。我不想再從互聯網上檢索文件夾數據,因此可以跟蹤以前的活動狀態?這是我的活動的一段代碼。由於迴歸遞歸活動(FileSystem like)

public class RisorseActivity extends DashboardActivity implements Observer { 
private Docente docente; 
private String get_response; 
private String response; 
//private HttpsClient client; 

private ListView list; 
private RelativeLayout progressLayout; 
private ProgressBar progressBar; 
private TextView txtMateriale; 

private ArrayList<Risorsa> risorseList; 
private RisorseAdapter risAdapter; 
private RisorseList risList; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_risorse); 
    setTitleFromActivityLabel(R.id.title_text); 

    list = (ListView) findViewById(R.id.ListRisorse); 
    list.setClickable(true); 


    Intent intent = getIntent(); 
    // vengono recuperati i parametri dalla activity chiamante 
    docente = (Docente) intent.getSerializableExtra(getPackageName() + ".Docente"); 
    //cartella = (Insegnamento) intent.getSerializableExtra(pkg + ".Insegnamento"); 
    get_response = intent.getExtras().getString("get_response"); 
    response = intent.getExtras().getString("response"); 

    list.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> arg0, View view, 
       int position, long index) { 
      if (risorseList.get(position).getType().equalsIgnoreCase("Folder")) { 
       Intent intRisorse = new Intent(getApplicationContext(), RisorseActivity.class); 
       intRisorse.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intRisorse.putExtra(getPackageName() + ".Docente", docente); 
       intRisorse.putExtra("get_response", risorseList.get(position).getURL()); 
       startActivity(intRisorse); 
      } else if (risorseList.get(position).getType().equalsIgnoreCase("File")) { 
       //--------------- DOWNLOAD DEL FILE------------------- 
      } 
     } 
    }); 


    startRisorseService(); 
} 


// Aggiorna la View della Activity popolando la lista dei docenti trovati 
private void updateView() { 

    this.risAdapter = new RisorseAdapter(this, this.risorseList); 
    if (this.risAdapter != null) { 
     this.list.setAdapter(this.risAdapter); 

    } else { 
     Toast.makeText(this, "Errore caricamento lista materiale", 
       Toast.LENGTH_LONG).show(); 
    } 
} 

private void startRisorseService() { 
    // risList conterrà il nostro modello dei dati (l'array di oggetti 
    // Ricevimento) 
    risList = RisorseList.getInstance(); 
    if (risList.countObservers() == 0) 
     risList.addObserver(this); // aggiungiamo la nostra "View" come 
            // osservatore del modello dati 

    loginState = ((LoginState) getApplicationContext()); 

    Handler handler = new RisorseHandler(); 
      //IT IS THE TASK THATH RETRIEVE THE DATA 
    RisorseService task = null; 
    if (response != null){ 
     task = new RisorseService(handler, loginState, response); 
    }else 
     task = new RisorseService(handler, loginState); 
    if (task != null) 
     task.execute(get_response); 
} 

public void update(Observable observable, Object arg1) { 
    if(observable instanceof RisorseList){ 
     // in quanto potremmo avere piu modelli dati 
     // verifichiamo su quale modello è avvenuto un cambiamento dei dati 
     // prima di effettuare il cast 
     this.risorseList = ((RisorseList) observable).getData(); 
    } 
      updateView(); 
    risList.deleteObserver(this); 
} 

public void onClickRefresh(View v) { 
    startRisorseService(); 
} 


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

      // IF I UNCOMMENT THESE LINES IT WORK BUT RETRIEVE DATA FROM INTERNET AGAIN!!! 
    /*if (risAdapter == null) 
     startRisorseService(); 
    else{ 
     risAdapter.notifyDataSetChanged(); 

    }*/ 
    if (risAdapter != null) 
    updateView(); 
} 

}

回答

0

請檢查Saving Android Activity state using Save Instance State

基本上,你將要使用public void onSaveInstanceState(Bundle savedInstanceState)public void onRestoreInstanceState(Bundle savedInstanceState),節省您想在包(的onSaveInstanceState)保存,並在onRestoreInstanceState

取回他們的事情

希望這有助於!

1

這不會回答你的問題,但你有沒有考慮使用Fragments而不是每次創建一個新的活動?

想法是,您將在Fragment中顯示列表項,而不是在每次打開文件夾時重新創建RisorseActivity,您都會用新的文件夾替換舊的片段。

此外,在提交片段之前,您需要調用addToBackStack(),以便將事務添加到片段事務的後端堆棧。該後退堆棧由該活動管理,並允許用戶通過按Back按鈕返回到前一個片段狀態。

這樣,當你回去時,堆棧中的前一個片段將彈出,並且不會再次下載任何數據。

0

在這種情況下,最好使用單個實例進行單個活動,將其自己的堆棧文件夾保存在路徑上並處理後退按鈕按下。它比在堆棧上進行多項活動更高效。