场景:在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)
呢?
怪我咯2017-04-18 09:51:23
ListView に対応する ListAdapter で ListView のステータスを直接認識する方法はありません。RecyclerView.Adapter には、ニーズを実現するためのメソッド public void onAttachedToRecyclerView(RecyclerView recyclerView)
と public void onDetachedFromRecyclerView(RecyclerView recyclerView)
があります。
しかし、私の提案は、BroadcastAdapter が構築されるイベント ハンドラー (通常はアクティビティまたはフラグメント) を登録および登録解除することです。
元の投稿者によると、EventBus 関連のものを BroadcastAdapter に完全にカプセル化したいと考えています。EventBus の存在は外部から認識されるべきではありません。これは完全に BroadcastAdapter のものであり、 BroadcastAdapter のユーザー、つまりデカップリング。
まず、EventBus の register および unregister を呼び出すのに適切なタイミングはいつですか?私の答えは、イベント処理が必要な場合と必要ない場合です (ナンセンス...)。一般的によく使用される場所は、onCreate、onDestory (または onResume、onPause) です。投稿者の場合、それは BroadcastAdapter である必要があります。そして、使用しないとき。
ここでは、投稿者のアダプターが継承された RecyclerView.Adapter であると仮定します。前述の public void onAttachedToRecyclerView(RecyclerView recyclerView)
と public void onDetachedFromRecyclerView(RecyclerView recyclerView)
は、アダプターが RecyclerView に関連付けられるとき、または関連付けが解除されるときに呼び出されるメソッドです。 Adaptor は、RecyclerView に割り当てられて初めて有用なアダプターとみなされます。そのため、onAttachedToRecyclerView
と onDetachedFromRecyclerView
は、BroadcastAdapter を使用する場合の と使用しない場合の に相当すると思います。ただし、問題があり、Android のソース コードを確認したところ、onDetachedFromRecyclerView は他のアダプタを置き換える場合にのみ呼び出されるため、RecyclerView を使用しない場合は setAdapter(null)
する必要があります。
実は、ここまで言っても、私が言いたい答えではありません - -|||、ポスターのデザインが足りないと思います。アダプターはその仕事 (データをビューに適合させる) を誠実に実行する必要があり、カスタム ビューもそのビューを静かに表示する必要があります。私の設計計画は、イベント処理中にビューを更新する必要がある場合に、イベント処理を Activity
または Fragment
に配置することです (イベント処理ではビューを更新するだけでなく、データなども更新する必要がある場合があります)。これは View に配置されており、Adapter は明らかに不適切です)、View はビューを更新できるいくつかのインターフェイスを提供します。このように、Activity はイベント処理を担当し、Controller の役割を果たしますが、View は単純にそのビューを担当するのが 分離 だと思います。オブジェクト指向設計原則の 1 つは、単一責任原則 です。