我有一个活动,其中包含客户订单的列表/适配器视图以及用于添加新订单的第二个活动。当销毁添加订单活动时,我将订单保存到SQLLite数据库并返回显示客户订单的活动。
但刚刚添加的订单不在列表中!!
我尝试过StartActivityForResult,但这似乎不起作用。
我试图将list / adapter刷新放在onActivityResume,onResume,onRestart上,但是刚添加的顺序仍然不在列表中。
我不想将订单保存与活动结束分开,因为这与用户体验不符。
我在调用添加订单活动之前已经保存了订单数量,然后在调用addOrder活动之前等待订单数量大于订单数量,但这不能很好地流动。
我的问题是如何最好地处理这种情况,就像用户体验所添加的订单需要在订单列表中一样。
我有另一个活动,可以删除订单,当返回到父订单时,订单将从数据库中删除,因此不会在列表中删除。我认为这是因为删除比插入??
更快- >更新2018/04/25
感谢您的评论。我已经做了一个代码示例来解释这个问题,并且这样做现在可以更好地理解执行流程以及我遇到问题的原因。
下面是调用活动B的活动A的代码。
public class AActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Intent activityB = new Intent(this, BActivity.class );
startActivityForResult(activityB,2);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
debug("Resfreshing list from database");
debug("onActivityResult with result code "+resultCode);
}
void debug(String inmes){Log.e("Activity A:",inmes);}
}
public class BActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
ConstraintLayout cL=findViewById(R.id.cl);
cL.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
debug("onTouch: going to return 7");
Intent i = new Intent();
setResult(7, i);
finish();
return false;
}
});
}
@Override
public void onDestroy(){
super.onDestroy();
debug("Inserting record into database");
debug("onDestroy: going to return 12");
Intent i = new Intent();
setResult(12, i);
}
void debug(String inmes){
Log.e("Activity B:",inmes);}
}
下面的控制台输出解释了我的问题是什么,因为当我点击后退按钮0被返回时,此时我从数据库刷新了我的列表,但由于onDestroy尚未执行,记录还没有已创建。
Activity A:: Resfreshing list from database.
Activity A:: onActivityResult with result code 0.
Activity B:: Inserting record into database.
Activity B:: onDestroy: going to return 12.
同样与TouchListner相同(显然): -
Activity B:: onTouch: going to return 7.
Activity A:: Resfreshing list from database.
Activity A:: onActivityResult with result code 7.
Activity B:: Inserting record into database.
Activity B:: onDestroy: going to return 12.
结论和解决方案是覆盖onBackPressed以进行数据库更新。 以下是更新后的活动B;
public class BActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_b);
ConstraintLayout cL=findViewById(R.id.cl);
cL.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
debug("onTouch: going to return 7");
Intent i = new Intent();
setResult(7, i);
finish();
return false;
}
});
}
@Override
public void onBackPressed(){
debug("Inserting record into database");
debug("onBackPressed: going to return 38");
Intent i = new Intent();
setResult(38, i);
super.onBackPressed();;
}
@Override
public void onDestroy(){
super.onDestroy();
debug("onDestroy: going to return 12");
Intent i = new Intent();
setResult(12, i);
}
void debug(String inmes){
Log.e("Activity B:",inmes);}
}
控制台输出,现在将记录插入数据库,然后将焦点移回活动A: -
Activity B:: Inserting record into database.
Activity B:: onBackPressed: going to return 38.
Activity A:: Resfreshing list from database.
Activity A:: onActivityResult with result code 38.
Activity B:: onDestroy: going to return 12.
我现在知道onDestroy是一个后台事件,不应该用于与应用程序交互流程相关的任何内容。
答案 0 :(得分:0)
试试这个,当你在第二个活动中添加订单后回来时,它会刷新你的第一个活动。 使用StartActivityForResult调用第二个活动,并在第一个活动中添加此代码。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Intent i = new Intent(Activity1.this, Activity1.class);
startActivity(i);
}
在完成或销毁第二项活动之前,请添加以下行
Intent i = new Intent();
setResult(2, i);
this.finish();