如果我们有两项活动:
用户从列表中选择一个文件并进入文件编辑活动。完成编辑后,用户按下后退按钮返回文件列表。
列表未重新加载,因此刚刚编辑的文件修改时间显示的值不正确。
按下后退按钮后,文件列表刷新的正确方法是什么?
此示例假定没有使用数据库,只是使用ArrayAdapter。
答案 0 :(得分:98)
一种选择是使用第一项活动的onResume。
@Override
public void onResume()
{ // After a pause OR at startup
super.onResume();
//Refresh your stuff here
}
或者您可以启动结果活动:
Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);
在secondActivity中,如果要发回数据:
Intent returnIntent = new Intent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();
如果您不想返回数据:
Intent returnIntent = new Intent();
setResult(RESULT_CANCELED, returnIntent);
finish();
现在,在FirstActivity类中,为onActivityResult()
方法
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == RESULT_OK){
//Update List
}
if (resultCode == RESULT_CANCELED) {
//Do nothing?
}
}
}//onActivityResult
答案 1 :(得分:36)
我认为onRestart()对此更有效。
@Override
public void onRestart() {
super.onRestart();
//When BACK BUTTON is pressed, the activity on the stack is restarted
//Do what you want on the refresh procedure here
}
您可以在onRestart()中重新启动Activity(从事件'后退按钮'再次调用)时编写您想要执行的操作。
例如,如果您想要在onCreate()中执行相同的操作,请将代码粘贴到onRestart()中(例如,使用更新的值重新构建UI)。
答案 2 :(得分:30)
在main中:
@Override
public void onRestart()
{
super.onRestart();
finish();
startActivity(getIntent());
}
答案 3 :(得分:8)
我建议覆盖活动编号1中的onResume()
方法,并在其中包含刷新数组适配器的代码,这可以通过使用[yourListViewAdapater].notifyDataSetChanged();
如果您在刷新列表时遇到问题,请阅读此内容:Android List view refresh
答案 4 :(得分:2)
如果您想刷新以前的活动,此解决方案应该有效:
在您要刷新的上一个活动中:
@Override
public void onRestart()
{
super.onRestart();
// do some stuff here
}
答案 5 :(得分:1)
@Override
protected void onRestart() {
super.onRestart();
finish();
overridePendingTransition(0, 0);
startActivity(getIntent());
overridePendingTransition(0, 0);
}
在上一个活动中,请使用此代码。这样可以进行平滑的过渡,并在您按下返回按钮回来时重新加载活动。
答案 6 :(得分:0)
如果没有处理来自编辑活动的回调(使用onActivityResult),那么我宁愿把你提到的逻辑放在onStart(或者可能在onRestart中),因为在onResume中使用它只是看起来有点矫枉过正,因为改变是仅在onStop之后发生。
无论如何,要熟悉the Activity lifecycle。另外,请注意onRestoreInstanceState和onSaveInstanceState方法,这些方法没有出现在漂亮的生命周期图中。
(另外,值得回顾the Notepad Tutorial如何处理您正在做的事情,尽管它确实使用了数据库。)
答案 7 :(得分:0)
private Cursor getAllFavorites() {
return mDb.query(DocsDsctnContract.DocsDsctnEntry.Description_Table_Name,
null,
null,
null,
null,
null,
DocsDsctnContract.DocsDsctnEntry.COLUMN_Timest);
}
@Override
public void onResume()
{ // After a pause OR at startup
super.onResume();
mAdapter.swapCursor(getAllFavorites());
mAdapter.notifyDataSetChanged();
}
public void swapCursor(Cursor newCursor){
if (mCursor!=null) mCursor.close();
mCursor = newCursor;
if (newCursor != null){
mAdapter.notifyDataSetChanged();
}
}
我只有收藏夹类别所以当我点击收藏夹中的项目时会出现这样的信息,如果我不喜欢它 - 这个项目应该从收藏夹中删除:为此我刷新数据库并将其设置为适配器(用于recyclerview)[我希望你能理解我的问题&溶液]
答案 8 :(得分:0)
尝试一下
public void refreshActivity() {
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
}
或在片段中
public void refreshActivity() {
Intent i = new Intent(getActivity(), MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();
}
并将此方法添加到onBackPressed()之类的
@Override
public void onBackPressed() {
refreshActivity();
super.onBackPressed();
}
}
就这样...
答案 9 :(得分:0)
@Override
public void onBackPressed() {
Intent intent = new Intent(this,DesiredActivity.class);
startActivity(intent);
super.onBackPressed();
}
答案 10 :(得分:-1)
最好的方法是使用
Intent i = new Intent(this.myActivity, SecondActivity.class);
startActivityForResult(i, 1);