Maison > Questions et réponses > le corps du texte
ViewPager+Fragment,某个Fragment里面的一条数据发生变化,如何局部刷新这条数据
巴扎黑2017-04-17 17:44:05
Lorsque l'élément de
ViewPager
est Fragment
, FragmentPagerAdapter
est généralement utilisé comme adaptateur, et cette classe ajoutera une balise lors de l'ajout de Fragment
Voir la méthode FragmentPagerAdapter
instantiateItem()
dans la source. code de
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 省略
if (fragment != null) {
// 省略
} else {
// 省略部分代码
// 下面这句就是添加Fragment的语句, 第三个参数就是指定Fragment的tag,
// 你可以利用这个tag获取到对应的Fragment实例, 有了实例就可以随意更新Fragment的视图了
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
// 省略
return fragment;
}
Cette balise est obtenue via une méthode privée de makeFragmentName()
, mais il vous suffit de copier cette méthode directement. Le paramètre viewId de cette méthode doit être l'identifiant de ViewPager
, et l'itemId est la méthode getItemId()
. de l'adaptateur. Vous pouvez donc assembler l'étiquette vous-même et obtenir le fragment.
C'est tout.
ringa_lee2017-04-17 17:44:05
Si vous utilisez RecyclerView, vous pouvez utiliser Eventbus comme ceci
mAdapter.getItem(event.position).setCommentCount(mAdapter.getItem(event.position).getCommentCount()+1);
mAdapter.notifyItemChanged(event.position);
ringa_lee2017-04-17 17:44:05
Je réfléchis également à ce problème depuis un moment, et après avoir cherché, je n'ai pas trouvé de bonne solution. Le pagerfragmentadapter ne semble pas fournir d'API pour obtenir le fragment correspondant.
J'ai créé une liste de références faibles dans l'index et je l'ai ajoutée à l'adaptateur lors de l'initialisation du fragment, puis j'ai réécrit le onDestroyItem de l'adaptateur (probablement appelé ainsi ? Je ne me souviens plus) pour supprimer l'entrée correspondante dans la liste ici.
Vous pouvez l'utiliser comme vous le souhaitez après avoir obtenu l'instance de fragment.
天蓬老师2017-04-17 17:44:05
Lorsque le Fragment est au premier plan, vous pouvez utiliser LocalBroadcastManager / EventBus / otto / Rx pour vous abonner à un événement (message)
Lorsque le fragment passe en arrière-plan, annulez l'abonnement. Lorsque le fragment passe à nouveau au premier plan, actualisez les données de la page et réabonnez-vous