如何在方向更改时销毁ViewPager的项目?

时间:2013-07-19 21:04:28

标签: android android-fragments android-viewpager android-orientation

我有一个ViewPager,我显示了多个项目。我使用了将多个项目放在一个片段中的解决方案,并创建了一个适配器,用于根据屏幕宽度计算每个片段可以放置的项目数。

我的FragmentPagerAdapter的getItem为每个片段创建一系列项目,除以每个片段的项目数量。

例如,我有12个项目,纵向方向,我可以放3个项目。 getItem将创建范围为0-2,3-5,6-8和9-11的片段。在横向方向上,由于屏幕的宽度较大,我可以放置例如5个项目。因此,范围将是0-4,5-8和9-11。

根据这个要求,我需要创建新的碎片并在方向更改时销毁旧碎片。

我创建了一个解决方案,但它取决于Activity的方法isChangingConfigurations()。但是这种方法仅适用于API级别11及更高级别。所以我无法使用它。

基本上,我不允许片段保存其状态,如果配置发生变化,我会在onPause中删除它。但由于我在旧的Android版本中没有这种方法,我需要另一种解决方案。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

另一种解决方案是:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    if (pagerAdapter != null) {
        pagerAdapter.removeAllfragments();
    }
    super.onSaveInstanceState(savedInstanceState);
}

适配器的代码:

public void removeAllfragments()
{
    if ( mFragmentList != null ) {
        for ( Fragment fragment : mFragmentList ) {
            mFm.beginTransaction().remove(fragment).commit();
        }
        mFragmentList.clear();
        notifyDataSetChanged();
    }
}

mFragmentList应该在:

中添加片段
@Override
public Fragment getItem(int position) {}

答案 1 :(得分:0)

您当前方法的最简单解决方案可能是确保getItem(int)返回横向和纵向方向的不同值。 id用于生成片段标记,在方向更改后,用于检索分离的片段并重新附加它。对于分别有3个项目和5个项目彼此相邻的情况的不同ID,如果应该有5个,则永远不会重新附加包含3个项目的片段。

默认情况下,getItemId(int)只返回元素的提供位置,如下所示:

public long getItemId(int position) {
    return position;
}

为了为您的情况返回不同的ID,您有多种选择。一个简单的方法是使用为给定位置显示的所有项目的索引做一些聪明的事情。或者,您可以执行简单的设备方向检查并使用项目总数来偏移id,或者使用字符串和哈希码等做一些聪明的事情。只需确保为相同方向的相同片段返回相同的id。