2011-11-26 33 views
5

Tôi có một ứng dụng tạo nhiều đệ quy của một hoạt động khi nó đi qua một hệ thống tệp (một hoạt động trên mỗi thư mục). Tôi lấy dữ liệu thông qua Intent khi di chuyển về phía trước trong ngăn xếp hoạt động (tức là duyệt qua thư mục bình thường). Các ứng dụng chạy tốt khi tôi đi từ thư mục mẹ sang thư mục con. Tôi gặp vấn đề khi quay trở lại, vì danh sách các tập tin/thư mục vẫn giữ nguyên hoạt động trước đó (đứa trẻ). Tôi không muốn truy xuất lại dữ liệu thư mục từ internet, vì vậy có thể theo dõi trạng thái hoạt động trước đó? Đây là một đoạn mã của hoạt động của tôi. Cảm ơnQuay trở lại hoạt động đệ quy (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(); 
} 

}

Trả lời

0

Vui lòng kiểm tra Saving Android Activity state using Save Instance State

Về cơ bản, bạn sẽ muốn sử dụng public void onSaveInstanceState(Bundle savedInstanceState)public void onRestoreInstanceState(Bundle savedInstanceState), tiết kiệm những thứ bạn muốn lưu trong Bundle (onSaveInstanceState) và lấy chúng ở onRestoreInstanceState

Hy vọng điều này sẽ hữu ích!

1

Điều này sẽ không trả lời câu hỏi của bạn, nhưng bạn có cân nhắc sử dụng Fragments thay vì tạo mỗi lần một hoạt động mới không?

Ý tưởng là bạn sẽ hiển thị các mục danh sách trong một Fragment và thay vì tạo lại RisorseActivity mỗi lần mở thư mục, bạn sẽ thay thế đoạn cũ bằng một thư mục mới.

Ngoài ra, trước khi cam kết đoạn, bạn sẽ gọi addToBackStack(), để thêm giao dịch vào một chồng giao dịch phân đoạn trở lại. Ngăn xếp ngược này được quản lý bởi hoạt động và cho phép người dùng quay lại trạng thái phân đoạn trước đó bằng cách nhấn nút Quay lại.

Bằng cách này, khi bạn quay trở lại, đoạn trước đó từ ngăn xếp sẽ bật lên và không có dữ liệu nào sẽ được tải xuống lại.

0

Trong trường hợp này, tốt hơn là nên có một hoạt động đơn lẻ với một cá thể duy nhất giúp lưu trữ chồng thư mục riêng của nó trên đường dẫn và xử lý việc nhấn nút quay lại. Nó hiệu quả hơn việc có nhiều hoạt động trên stack.

Các vấn đề liên quan