平时,我们的项目中会经常用到fragment这个控件,一般情况下,我们将数据放在fragment里,而大部分UI在activity中,如果需要在数据改变时实时刷新我们的UI,那么就要用到framgent与Activity数据的传递了。
常用的一般有三种方式来实现以上需求:
1. 通过fragment中brocastReceiver来通知activity刷新UI;
2. 通过eventbus订阅者模式来通知Activity实时刷新UI;
3. 通过fragment中编写接口设置监听器,然后在actvity中实现该接口,在接口方法中刷新UI即可
由于项目中集成了eventbus,所以取近弃远,通过一个例子来说明一下用法:
需求:通过fragment中recyclerview下拉刷新和上拉加载操作改变Activity中的FloatingActionButton的状态(即上拉隐藏fab,下拉显示)
fragment中:
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); if(distance < -ViewConfiguration.getTouchSlop() && !visible){ //显示fab EventBus.getDefault().postSticky("show_upload_view"); distance = 0; visible = true; }else if(distance > ViewConfiguration.getTouchSlop() && visible){ //隐藏 EventBus.getDefault().postSticky("hide_upload_view"); distance = 0; visible = false; } if ((dy > 0 && visible) || (dy < 0 && !visible))//向下滑并且可见 或者 向上滑并且不可见 distance += dy; } });Activity中:
/** * by moos on 2017/10/18 * func:通过eventbus将fragment消息返回到activity中刷新fab状态 */ @Subscribe(threadMode = ThreadMode.MAIN, sticky = true) public void changeUpLoadViewState(String state){ loge("上传入口的state==="+state); if(state!=null ){ if(state.equals("show_upload_view")){ //显示 showFABAnimation(bt_upload); }else if(state.equals("hide_upload_view")){ //隐藏 hideFABAnimation(bt_upload); } } }
详细代码不贴了,只提供思路.