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); 
} 
相关问题