我们知道startActivityForResult( )较startActivity( )而言,不仅可以跳转到下一个activity,而且当被跳转的页面调用finish()后,可以自动跳回最初的activity,并在最初的activity中调用onActivityResult( )方法,获取从被跳转的activity中返回的数据进行相应操作。
在项目中通常有两种情况:
1在跳转后的页面进行相应操作后,数据发生变化,需要回传到上一页改变页面的显示状态。例如首页状态中有对播主的关注状态的显示,当进入详情页进行关注或取消操作,返回首页时相应的发生状态改变。
2跳转后的页面根据前一页传入的数据进行页面的相关展示,在用户操作展示状态后需要将数据返回给上一页,保证再次进入此页时,传入的数据与之前操作的状态一致。例如对播主的关注状态显示在详情页,这一状态根据上一页传来的数据显示,并可以操作取消或关注,当返回上页,再进入详情,要保证跟之前的操作状态显示一致。
上述两种情况原理是相似的,只是第一种需要在onActivityResult( )中将返回的数值设置更新后刷新界面,而第二种情况只需要将返回的数值设置更新,确定将要传入下一页的值做出了相应改变即可不用刷新界面,因为展示状态在下一页。这里针对第二种进行具体实现。
新闻列表条目显示进详情显示是否收藏,并可进行收藏或取消的操作。(详情的收藏字段根据列表页传入数据获得)
在新闻列表页跳转时:
Intent intent = new Intent(context,DetailActivity.class);
intent.putExtra("webUrl",news.get(position).webviewurl);
intent.putExtra("id", news.get(position).tid);
intent.putExtra("title", news.get(position).title);
intent.putExtra("content",news.get(position).title);
intent.putExtra("shareUrl",news.get(position).shareurl);
intent.putExtra("iscollect",Integer.parseInt(news.get(position).isfav));//传入是否收藏字段
startActivityForResult(intent, 1);//请求码1
tip:跳转返回时调用对应页的onActivityResult()方法,在adpter跳转则传参一个当前页过去再跳转,并在当前页复写onActivityResult方法。
例如:
Intent intent = new Intent(context,DetailActivity.class)
intent.putExtra("iscollect","1");
fragment.startActivityForResult(intent,1); //fragment即为创建adpter对象时传参过来的
在详情页操作收藏按钮后:
if ("1".equals(code)) {//点击收藏按钮并请求接口成功
if (isCollect == -1) {
isCollect = 1;//之前为收藏状态,访问成功则收藏成功
iv_store_tie
.setImageResource(R.drawable.content_collection);
} else {
isCollect = -1;//之前为收藏状态,访问成功则取消收藏成功
iv_store_tie
.setImageResource(R.drawable.content_uncollection);
}
Intent intent = new Intent();
intent.putExtra("isCollect", isCollect);//将收藏状态返回
intent.putExtra("id", id);//将此条新闻id返回
setResult(2, intent);//响应码2
}
回到新闻列表页,复写onActivityResult方法:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == 2) {//当前请求吗响应码
for (int i = 0; i < news.size(); i++) {//根据返回id遍历新闻集合将此新闻的收藏状态设置成返回的状态
if (data.getStringExtra("id").equals(
String.valueOf(news.get(i).typeid))) {
news.get(i).isfav = data.getIntExtra("isCollect",
-1);
}
}
adapter.rest(news);
} else if (requestCode == 3 && resultCode == 2) {//跳转同一页面的其他请求设置
---------
}
}
这样就实现了此功能的需求。
此外还有其他方式可实现类似功能:
1广播实现,当详情页状态改变时可以发送广播将相应id的收藏状态设置成新的状态。
2在列表页复写onResume方法,页面返回时刷新数据,但是此方法的弊端是要处理好分页加载的情况,否则每次返回,列表都翻到最开始的条目。