场景:在Android里,有一个Adapter,Activity里用Eventbus来post数据到这个adapter里。
问题:我可以在Adapter的构造方法里调用register()
方法:
public BroadcastAdapter(Context context) {
mContext = context;
EventBus.getDefault().register(this);
Log.d(TAG, "constructor");
}
但我要在哪里调用EventBus.getDefault().unregister(this)
呢?
在ListView对应的ListAdapter中是没办法直接感知ListView的状态,在RecyclerView.Adapter中有一对方法
public void onAttachedToRecyclerView(RecyclerView recyclerView)
及public void onDetachedFromRecyclerView(RecyclerView recyclerView)
可以实现你的需求。但是我的建议是在构造BroadcastAdapter的地方(一般是Activity或Fragment)注册及反注册Event Handler。
public void onAttachedToRecyclerView(RecyclerView recyclerView)
及public void onDetachedFromRecyclerView(RecyclerView recyclerView)
可以实现你的需求。但是我的建议是在构造BroadcastAdapter的地方(一般是Activity或Fragment)注册及反注册Event Handler。
补充回答
按照楼主的意思,是想把BroadcastAdapter里面的EventBus相关的东西完全封装在里面,不应该让外部感知到EventBus的存在,因为这完全是BroadcastAdapter的东西,与BroadcastAdapter的使用者无关,即解耦。
首先,EventBus的register和unregister是在什么时候调用合适?我的答案是在你需要及不需要的事件处理的时候(废话..),一般我们所常用的地方就是onCreate、onDestory(或onResume、onPause),在楼主的案例中应该是BroadcastAdapter使用及未使用的时候。
现在我假设楼主的Adapter是继承的RecyclerView.Adapter,之前提到的
public void onAttachedToRecyclerView(RecyclerView recyclerView)
及public void onDetachedFromRecyclerView(RecyclerView recyclerView)
是在Adapter关联及取消关联RecyclerView的时候会回调的方法。一个Adapter正在是赋给了RecyclerView才算做一个有用的Adapter,所以我觉得onAttachedToRecyclerView
及onDetachedFromRecyclerView
正对应的BroadcastAdapter使用及未使用的时候。但是,有一个问题,我看了下Android的源码,onDetachedFromRecyclerView只是在更换其它Adapter的时候会调用,所以你应该在不使用RecyclerView的时候setAdapter(null)
。其实说了这么多,都不是我想给的答案- -|||,我认为楼主的设计有所不足。一个Adapter应该认认真真地做好它的本职工作(数据与View的适配),一个自定义View也应该安安静静地去显示好它的视图。我的设计方案是把事件处理放在
Activity
或Fragment
补充回答
按照楼主的意思,是想把BroadcastAdapter里面的EventBus相关的东西完全封装在里面,不应该让外部感知到EventBus的存在,因为这完全是BroadcastAdapter的东西,与BroadcastAdapter的使用者无关,即解耦。首先,EventBus的register和unregister是在什么时候调用合适?我的答案是在你需要及不需要的事件处理的时候(废话..),一般我们所常用的地方就是onCreate、onDestory(或onResume、onPause),在楼主的案例中应该是BroadcastAdapter使用及未使用的时候。
现在我假设楼主的Adapter是继承的RecyclerView.Adapter,之前提到的
public void onAttachedToRecyclerView(RecyclerView recyclerView)
及public void onDetachedFromRecyclerView(RecyclerView recyclerView)
是在Adapter关联及取消关联RecyclerView的时候会回调的方法。一个Adapter正在是赋给了RecyclerView才算做一个有用的Adapter,所以我觉得onAttachedToRecyclerView
及onDetachedFromRecyclerView
正对应的BroadcastAdapter使用及未使用的时候。但是,有一个问题,我看了下Android的源码,onDetachedFromRecyclerView只是在更换其它Adapter的时候会调用,所以你应该在不使用RecyclerView的时候setAdapter(null)
。🎜🎜其实说了这么多,都不是我想给的答案- -|||,我认为楼主的设计有所不足。一个Adapter应该认认真真地做好它的本职工作(数据与View的适配),一个自定义View也应该安安静静地去显示好它的视图。我的设计方案是把事件处理放在
Activity
或Fragment
,在事件处理时需要更新视图的时候(有时候事件处理不仅需要更新视图,可能也需要更新数据之类的,这样放在View及Adapter里明显不合适),View给一些能更新视图的接口出来。这样Activity负责事件的处理,处于一种🎜Controller🎜的角色,而View简简单单的负责它的视图,我觉得这才是🎜解耦🎜。面向对象设计原则中有一条就是🎜单一职责原则🎜。🎜