使用viewpager的片段事务返回空白视图

时间:2015-12-30 19:07:41

标签: java android android-fragments android-viewpager

我正在使用带有视图寻呼机的tablayout来显示片段。我目前的设置是,我获得了“类别”的列表视图,用户点击了一个类别,然后返回一个新的片段,其中包含该类别中可用折扣的列表。

我的设置会创建新的DiscountList片段,但在原始片段执行其事务时不会更新视图。有人可以帮我找出正确的解决方案吗?我不确定我的viewpager是不正确还是我错过了一步。如果需要,我可以提供更多信息。谢谢!

CategoryListFragment.java:

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

    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
            transaction.replace(container.getId(), DiscountListFragment.newInstance(position))
                    .addToBackStack(null)
                    .commit();
        }
    });

    return view;
}

DiscountListFragment.java

public static DiscountListFragment newInstance(int categoryId) {
    DiscountListFragment discountListFragment = new DiscountListFragment();

    Bundle args = new Bundle();
    args.putInt("categoryId", categoryId);
    discountListFragment.setArguments(args);

    return discountListFragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        categoryId = getArguments().getInt("categoryId");
    }
    reactiveLocationProvider = new ReactiveLocationProvider(getActivity());
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_search_discount_list, container, false);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

ViewPager.java

/**
 * Retrieves the selected tab and returns it. If new tab needs to be added
 * simply increment case and return a new fragment
 * @param position the position of tab selected
 * @return the selected tab
 */

@Override
public Fragment getItem(int position) {

    switch (position) {
        case 0:
            return new HomeFragment();
        case 1:
            return new CategoryListFragment();
        case 2:
            return new MapViewFragment();
        case 3:
            return new MessagesFragment();
        default:
            return null;
    }
}

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

3 个答案:

答案 0 :(得分:2)

替换ViewPager中的片段的最佳方法是创建加载到寻呼机中的根片段。根分片默认加载fragment1,稍后可以用fragment2替换。 有人为此做了一个很好的例子,并把它放在Github上:https://github.com/danilao/fragments-viewpager-example

我会采用与示例稍微不同的方法,并让根片段负责切换片段,而不是子片段本身。但这是一个架构决策,取决于你。

答案 1 :(得分:0)

我认为transaction.replace()电话中的容器ID错误。如果CategoryListFragment是分页片段,则container.getId()是ViewPager的id。你不想要那个。您需要包含具有ViewPager(一级)的片段的容器的id。

答案 2 :(得分:0)

我遇到了同样的问题,花了很多时间。我改变了

mSectionsPagerAdapter = new SectionsPagerAdapter(getActivity().getSupportFragmentManager());

mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); 

的Viewpager片段。 我得到了here

的帮助