4

我有一個ListView(ItemsActivity)活動,其內容來自JSON API。當我在ListView中的一個項目中按下時,它將加載另一個具有詳細信息的活動(DetailActivity)。問題是,當我按下後退按鈕時,ItemsActivity會重新加載ListView。活動重新加載每次

我不知道在哪裏可以找到關於此的更多信息。我來自iOS,前一個屏幕不會每次都重新加載。

我想保留活動之間的ListView數據。我測試從onResume()調用loadListItems()方法,但結果相同。

這裏是我的代碼簡短示例。任何幫助和建議將非常感激。

/* ItemsActivity.java */ 
public class ItemsActivity extends AppCompatActivity { 
    private ListView listItemView; 
    private Movie[] movies; 
    private ProgressBar progressBar; 

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

    listItemView = (ListView) findViewById(R.id.listItemView); 
    progressBar = (ProgressBar) findViewById(R.id.progressBar); 

    loadListItems(); 
    } 

    private void loadListItems(){ 
    // Http call 
    ... 
    // Iterate JSON and saving to movies array 
    ... 
    progressBar.setVisibility(INVISIBLE); 

    ListAdapter adapter = new ListAdapter(ItemsActivity.this, movies); 
    listItemView.setAdapter(adapter); 
    } 

    /* Adapter Class */ 

    @Override 
    public void onClick(View v) { 
    Intent i = new Intent(this, DetailActivity.class); 
    i.putExtra("item_id", 1); 
    startActivity(i); 
    } 
} 

我剛剛測試了一個帶有2個活動,ActivityOne和ActivityTwo的新項目。 ActivityOne有一個按鈕,當按下它的加載ActivityTwo並且當我按下後退按鈕時,在ActivityOne中再次調用onCreate()方法。

+0

你可以嘗試把onCreate()和一個onResume()中的日誌看看它是否每次都被調用? – Pablo

+0

你可以發佈你的第二個活動代碼嗎?我想你會再次開始ActivityOne,而不是完成ActivityTwo。因爲從ActivityTwo返回時不應調用onCreate()。 – Rami

回答

0

您提到「我測試了從onResume()調用loadListItems()方法但結果相同。」這個onResume()代碼是罪魁禍首。

OnResume()將在您的活動重新獲得焦點時得到調用。如果您在onResume()中調用loadListItems(),則每次從第二個活動返回到此活動時都會調用它。 http://developer.android.com/reference/android/app/Activity.html#onResume()

+0

目前我只在onCreate()中調用loadListItems()而不是在onResume()中。 – isaiasmac

+0

我希望您在按DetailActivity()後退按鈕時不會重新啓動ItemsActivity .... – vicky

+0

我現在該怎麼辦? DetailActivity沒有任何與ItemsActivity相關的代碼。 – isaiasmac

0

解決方案是使用StartActivityForResult而不是StartActivity。然後在第二個活動中,重寫onBackPressed方法並完成()該方法中的第二個活動。在第一個活動中覆蓋onActivityResult方法,這個活動將被調用,而不是onCreate方法,並且ListView不會被重新加載。

+1

**這是錯誤的!!! **使用'StartActivityForResult'而不是'StartActivity'與Activity的生命週期無關。如果您正在等待第二個活動的回調,則使用「StartActivityForResult」。 – Rami

0

只有當我從Action Bar中按下後退按鈕,並使用onOptionsItemSelected方法修復它時,問題纔出現。

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 

    if (id == android.R.id.home) { 
     onBackPressed(); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
相關問題