2

我有一个显示多个项目的 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 及以上。所以我不能使用它。

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

谁能帮我?

4

2 回答 2

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) {}
于 2013-10-15T13:01:17.013 回答
0

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

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

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

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

于 2013-07-19T21:41:44.147 回答