0

我正在尝试制作一个基本上由 3 个垂直滚动列表组成的片段的布局。单击列表中的项目将在列表右侧填充适当的数据,依此类推。单击最右侧列表中的项目时,将引入一个新片段。所以我想要实现的是一种在单击最后一个项目时添加第二个片段的方法,并且具有这样的功能,即向右滑动将带您回到第一个片段并删除第二个片段。似乎使用带有自定义 FragmentPagerAdapter 的 ViewPager 是可行的方法,但我不确定如何实现适配器以适应我的特定功能。

我也在查看这篇文章中接受的答案:动态添加和删除视图到 viewpager。它似乎接近我想要的,但我不太确定,我也不确定如何将它适应 FragmentPagerAdapter,特别是我将如何实现 getItem()。

任何帮助,将不胜感激。

4

1 回答 1

0

如果有人感兴趣,我相信我已经找到了解决问题的适当方法。

我创建了我的 FragmentPagerAdapter 以便正常初始化第一页,但第二页只是稍后将初始化片段的容器。

public static class ContractDetailsPagerAdapter extends FragmentPagerAdapter {
int numFrags = 2;

    public ContractDetailsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        Fragment fragment = null;
        String argObject = null;

        switch (position) {
        case 0:
            fragment = new SectionsFragment();
            argObject = SectionsFragment.ARG_OBJECT;
            break;
        case 1:
            fragment = new DetailsFragmentContainer();
            argObject = DetailsFragmentContainer.ARG_OBJECT;
            break;
        default:
            Log.e("ContractDetailsPagerAdapter", "called getItem outofbounds");
            return null;
        }

        Bundle bundle = new Bundle();
        bundle.putInt(argObject, position+1);
        fragment.setArguments(bundle);
        return fragment;
    }

    @Override
    public int getCount() {
        return numFrags;
    }
}

在 FragmentPagerAdapter 中,SectionsFragment 是第一个具有 3 个 ListView 的 Fragment,DetailsFragmentContainer 只是一个容器,稍后将初始化 DetailsFragment。

public class DetailsFragmentContainer extends Fragment {

public static final String ARG_OBJECT = "details_fragment_container";

Bundle ids;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    ids = getArguments();
    View v = inflater.inflate(R.layout.fragments_container, container, false);
    return v;
}

public void createDetailsFragment(int parentItemId) {
    Fragment fragment = new DetailsFragment();
    ids.putInt(Columns.COLUMN_PARENTITEMID, parentItemId);
    fragment.setArguments(ids);
    getChildFragmentManager().beginTransaction().add(R.id.fragments_frame, fragment).commit();
}

}

以及容器的 XML 布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragments_frame"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

</FrameLayout>

parentitemid 是我稍后从 SectionsFragment 中单击第三列中的项目时需要得到的。

然后,使用如何通过在 ViewPager 中用手指滑动来禁用分页但仍然能够以编程方式滑动的接受的答案?,我稍微调整了一下,以便可以设置被刷卡的能力。

public class SetSwipeableViewPager extends ViewPager {

boolean canSwipe = false;

public SetSwipeableViewPager(Context context) {
    super(context);
}

public SetSwipeableViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    if (!canSwipe) {
        return false;
    }

    return super.onInterceptTouchEvent(event);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (!canSwipe) {
        return false;
    }

    return super.onTouchEvent(event);
}

public void canSwipe(boolean swipeable) {
    canSwipe = swipeable;
}
}

有了这个,我们可以简单地将当我们在第一页时滑动的能力设置为 false,并在我们离开时启用它。

首先,我们设置一个监听器来检查我们何时选择第一页并禁用滑动。

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    if (position == 0)
                        mViewPager.canSwipe(false);
                }
            });

当我们在第 3 个列表中选择一个项目时,我们创建 DetailsFragment 并将其放入 DetailsFragmentContainer 中,将当前项目设置为 1,以便 viewpager 显示第 2 页,然后重新启用滑动。

public void OnSection3Selected(long id) {
    int parentItemId = ContractDetailsActivity.getItemId(id, getActivity());

    ...

    ((DetailsFragmentContainer) fragment).createDetailsFragment(parentItemId);
    mViewPager.setCurrentItem(1);
    mViewPager.canSwipe(true);
}

我希望这对某人有帮助!

于 2013-08-07T20:51:38.817 回答