ViewPager + FragmentStatePagerAdapter:如何使用新适配器重新创建所有片段

时间:2013-12-21 12:14:55

标签: android android-viewpager

我正在使用v4兼容性库。我有一个Fragment Tabhost,第一个选项卡有一个使用FragmentStatePagerAdapter的ViewPager。问题是当我切换到其他选项卡,更改第一个选项卡的ViewPager的数据,然后返回到第一个选项卡,使用新数据重新创建新适配器并将其设置为ViewPager,但ViewPager中的前3个片段仍然保留对旧数据的引用。

我在第一个创建适配器的选项卡中的代码(在onCreateView方法中调用):

private void setPagerData() {
    if (mPager == null || AppConfig.getInstance().todayData == null)
        return;

    if (AppConfig.getInstance().todayData != null && !AppConfig.getInstance().todayData.isEmpty()) {
        //
        mPager.setOffscreenPageLimit(AppConfig.PAGER_OFFSCREEN_PAGE_LIMIT);
        mPager.setAlwaysDrawnWithCacheEnabled(true);
        //
        mAdapter = new TodayPagerAdapter(getChildFragmentManager(), AppConfig.getInstance().todayData);
        mPager.setAdapter(mAdapter);
        mAdapter.notifyDataSetChanged();
        if (mAdapter.getCount() == 1)
            mPager.setCurrentItem(0);
        else
            mPager.setCurrentItem(1);

        text_currentpage.setText("1");
        text_totalpage.setText(String.valueOf(mAdapter.getCount() - 2));
        anim_numpage = AnimationUtils.loadAnimation(TodayFragment.this.getActivity(), R.anim.fade_numpage);
        layout_numpage.setVisibility(View.INVISIBLE);
        image_nextpage.setOnClickListener(this);
        image_prevpage.setOnClickListener(this);
        //
        mPager.setOnPageChangeListener(this);

    } else
        onNoData(true);
}

onDestroyView():

public void onDestroyView() {
    AppUtils.Log("Destroy view Today Fragment");
    mAdapter = null;
    mPager = null;
    super.onDestroyView();
}

我的适配器:

    public class TodayPagerAdapter extends FragmentStatePagerAdapter {

    private List<PostDTO> posts;
    private FragmentManager fm;

    public TodayPagerAdapter(FragmentManager fm, List<PostDTO> posts) {
        super(fm);
        this.fm = fm;
        this.posts = posts;
        if (posts == null)
            posts = new ArrayList<PostDTO>();
    }

    @Override
    public Fragment getItem(int page) {
        if (page == 0 && posts.size() > 1)
            return TodayPagerFragment.init(posts.size() - 1, posts.get(posts.size() - 1));
        if (page == posts.size() + 1)
            return TodayPagerFragment.init(0, posts.get(0));
        if (posts.size() > 1)
            return TodayPagerFragment.init(page - 1, posts.get(page - 1));
        return TodayPagerFragment.init(page, posts.get(page));
    }

    @Override
    public int getCount() {
        if (posts.size() <= 1)
            return posts.size();
        return posts.size() + 2;
    }

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }
}

我的ViewPager片段:

    public class TodayPagerFragment extends AbstractFragment implements View.OnClickListener {

    int page;

    private ImageView iv_image;
    private LikeButton button_like;
    private PostDTO data;

    public static TodayPagerFragment init(int val, PostDTO data) {
        TodayPagerFragment frm = new TodayPagerFragment();
        Bundle args = new Bundle();
        args.putInt("page", val);
        frm.setArguments(args);
        frm.data = data;
        return frm;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        page = getArguments() != null ? getArguments().getInt("page") : 0;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab_today_viewpager, container, false);
        setupView(view);

        iv_image = (ImageView) view.findViewById(R.id.today_viewpager_image);
        button_like = (LikeButton) view.findViewById(R.id.today_button_like);
        button_like.setUp(true);

        initViews();
        return view;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.today_viewpager_image:
            ((BaseContainerFragment) getParentFragment().getParentFragment()).replaceFragment(TodayDetailFragment.init(this.data), true);
            break;

        case R.id.today_button_like:
            if (!AppConfig.getInstance().isLoggedIn || AppConfig.getInstance().appUser == null) {
                AppUtils.openLogin(getActivity());

            } else {
                String ms = getString(R.string.do_you_want_to_like_this_post_);
                if (data.isLiked())
                    ms = getString(R.string.do_you_want_to_unlike_this_post_);
                new MyDialogHandler().confirm(getActivity(), getString(R.string.like_confirm), ms, getString(R.string.no), getString(R.string.yes), new Runnable() {
                    @Override
                    public void run() {
                        new PostLikeTask(button_like, data, !data.isLiked()).execute();
                        // data.setLiked(!data.isLiked());
                    }
                }, null);
            }
            break;

        default:
            break;
        }
    }

    // Setup view data
    private void initViews() {
        iv_image.setOnClickListener(this);
        button_like.setOnClickListener(this);

        if (this.data != null) {
            AppUtils.Log("Current: //////// " + (data.toString().equals(AppConfig.getInstance().todayData.get(page))));
            // if (AppConfig.getInstance().appUser != null &&
            // AppConfig.getInstance().isLoggedIn)
            // new GetLikedTask().execute();
            // else
            button_like.setData(data.getLikes(), data.isLiked());
            // ImageLoader.getInstance().displayImage(AppConfig.SERVER_IMAGE_URL
            // + this.data.getImage(), iv_image);
            // onLoading(true);
            UrlImageViewHelper.setUrlDrawable(iv_image, AppConfig.SERVER_IMAGE_URL + this.data.getImage());
        }
    }
}

0 个答案:

没有答案