场景:在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)
呢?
Il n'y a aucun moyen de percevoir directement l'état de ListView dans le ListAdapter correspondant à ListView. Il existe une paire de méthodes
public void onAttachedToRecyclerView(RecyclerView recyclerView)
etpublic void onDetachedFromRecyclerView(RecyclerView recyclerView)
dans RecyclerView.Adapter pour répondre à vos besoins.Mais ma suggestion est d'enregistrer et de désenregistrer le gestionnaire d'événements où le BroadcastAdapter est construit (généralement une activité ou un fragment).
Réponse supplémentaire
Selon l'affiche originale, je souhaite encapsuler complètement les éléments liés à EventBus dans BroadcastAdapter. L'existence d'EventBus ne doit pas être perçue par le monde extérieur, car il s'agit complètement d'une chose BroadcastAdapter et n'a rien à voir avec le BroadcastAdapter. les utilisateurs du BroadcastAdapter, c'est-à-dire leDécouplage.
Tout d'abord, quel est le moment approprié pour appeler pour vous inscrire et vous désinscrire d'EventBus ? Ma réponse est lorsque vous avez besoin ou non d'un traitement d'événements (absurdité...), généralement les endroits que nous utilisons couramment sont onCreate, onDestory (ou onResume, onPause). Dans le cas de l'affiche originale, cela devrait être BroadcastAdapter). . Et lorsqu'il n'est pas utilisé.
Maintenant, je suppose que l'adaptateur de l'affiche est un RecyclerView.Adapter hérité. Les
public void onAttachedToRecyclerView(RecyclerView recyclerView)
etpublic void onDetachedFromRecyclerView(RecyclerView recyclerView)
mentionnés précédemment sont des méthodes qui seront rappelées lorsque l'adaptateur s'associera et se dissociera du RecyclerView. Un adaptateur n'est considéré comme un adaptateur utile que lorsqu'il est attribué à RecyclerView, donc je pense queonAttachedToRecyclerView
etonDetachedFromRecyclerView
correspondent à lorsque BroadcastAdapter est utilisé et lorsqu'il n'est pas utilisé . Cependant, il y a un problème. J'ai regardé le code source d'Android et j'ai découvert que onDetachedFromRecyclerView n'est appelé que lors du remplacement d'autres adaptateurs, vous devriez doncsetAdapter(null)
lorsque vous n'utilisez pas RecyclerView.En fait, après avoir dit tant de choses, ce n'est pas la réponse que je veux donner - -|||, je pense que le design de l'affiche fait défaut. Un adaptateur doit consciencieusement faire son travail (adapter les données à la vue), et une vue personnalisée doit également afficher discrètement sa vue. Mon plan de conception est de placer le traitement des événements dans
Activity
ouFragment
Lorsque la vue doit être mise à jour pendant le traitement des événements (parfois, le traitement des événements doit non seulement mettre à jour la vue, mais peut également nécessiter la mise à jour des données, etc.). donc le placer dans View et Adapter est évidemment inapproprié), View fournit des interfaces qui peuvent mettre à jour la vue. De cette façon, Activity est responsable du traitement des événements et joue le rôle de Contrôleur, tandis que View est simplement responsable de sa vue, je pense qu'il s'agit d'un découplage. L'un des principes de conception orientée objet est le Principe de responsabilité unique.