我正在构建一个使用带有FragmentStatePagerAdapter的Viewpager的应用程序。FragmentStatePagerAdapter 获取一个对象数组,稍后用于将每个对象数据映射到片段。
适配器将3个片段加载到内存中(当我在一个页面上时,onCreateView被调用3次),它加载当前片段和接下来的两个片段。
我有以下问题:
我必须根据我所在的当前片段的内容更改来更改下一片段的内容。
我已经尝试修改FragmentStatePagerAdapter中的数组,然后在适配器上调用notifydatasetchanged,但是适配器不会再次加载下一页。
完成这件事的最好方法是什么?
一些代码和场景:我所在的当前片段包含用户数据,登录的用户可以跟踪他或取消跟踪。
下面是onClick代码:
if(mListener!=null)
mListener.onTweetUserFollowingStatusChanged(tweet.getUser());
带有视图的活动中侦听器的回调:
@Override
public void onTweetUserFollowingStatusChanged(User user) {
DataManager.getInstance().onTweetUserFollowStatusChanged(user);
List<Tweet> affectedTweets = mPagerAdapter.getTweetsWithUser(user);
for (Tweet affectedTweet: affectedTweets
) {
boolean affectedTweetCurrentUserFollowStats = affectedTweet.isFollowingTweetUser();
affectedTweet.setFollowingTweetUser(!affectedTweetCurrentUserFollowStats);
}
mPagerAdapter.notifyDataSetChanged();
}
下一页包含相同的用户。
因此,如果我在当前页面上跟踪他,我希望下一页的跟踪按钮显示“UNFOLLOW”
我找到了解决办法;
原始问题:
在更新 FragmentStateAdapter 中的数组后,我需要一种方法来更新适配器中已实例化的片段的 UI。
所以我在更新了FragmentStateAdapter中的数组后,只需调用notifyDataSetChange()并将这段代码添加到您的适配器中。
mPagerAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
FragmentStatePagerAdapter fragmentPagerAdapter = (FragmentStatePagerAdapter) VP_tweets.getAdapter();
for(int i = 0; i < fragmentPagerAdapter.getCount(); i++) {
TweetFragment viewPagerFragment = (TweetFragment) VP_tweets.getAdapter().instantiateItem(VP_tweets, i);
if(viewPagerFragment != null && viewPagerFragment.isAdded()) {
viewPagerFragment.updateUI();
}
}
}
});