gpt4 book ai didi

android - 具有同一类的多个 fragment 实例的 ViewPager

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:31 27 4
gpt4 key购买 nike

我正在尝试创建一个包含 5 个 fragment 的 ViewPager。5 个 fragment “容器”,因此每个 fragment 包含 2 个 fragment 。前 4 个 fragment 具有相同的布局并且属于同一类。第五个是别的类的,那个类没问题。

问题是当 Activity 启动时,似乎只有 1 个 fragment 在工作(viewPager 中位置 0 的 fragment )。我试图在我的 PagerAdapter 中的位置 0 处返回 new Fragment(),但是当我这样做时,它是第二个 fragment 。 (工作我的意思是显示左边的列表,我还没有处理右边的细节 fragment )

代码如下

CustomPagerAdapter.java

public class CustomPagerAdapter extends FragmentPagerAdapter{

public CustomPagerAdapter(FragmentManager fm) {
super(fm);
}
public CustomPagerAdapter(FragmentManager fm, Context context) {
super(fm);

}

@Override
public Fragment getItem(int pos) {

if(pos == 4)
return new OtherContainerFragment();
else
return new ContainerFragment(pos);

}

@Override
public int getCount() {

return 5;
}

容器 fragment .java

public class ContainerFragment extends Fragment {
private int CONTAINER_TYPE;

public ContainerFragment(){

}

public ContainerFragment(int type){
CONTAINER_TYPE = type;
}



@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}


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

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);


FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE);

ft.replace(R.id.replaceable_list, frag);

ft.commit();

自定义列表 fragment .java

public class CustomListFragment extends SuperCustomListFragment{

private ArrayList<Model> mModels;
private int TYPE;


public CustomListFragment(){

}

public CustomListFragment(int type){
TYPE = type;
}


@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

mModels = new ArrayList<Model>();


if(TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL){
mAdapter = AppUtils.getJournalListAdapter(getActivity(), mModels);
new syncPapers().execute();
}else if(TYPE == AppConstants.FRAGMENT_TYPE_MOVIES){
mAdapter = AppUtils.getMoviesListAdapter(getActivity(), mModels);
new syncMovies().execute();
}


if(mAdapter != null)
mListView.setAdapter(mAdapter); //mListView is defined in the superClass

这是我使用的常量:

public class AppConstants {


public static final int FRAGMENT_TYPE_AGENDA = 0; //so Fragment at position 0 should be of type agenda
public static final int FRAGMENT_TYPE_NEWS = 1; // position 1 should be of type news
public static final int FRAGMENT_TYPE_MOVIES = 2; // ...
public static final int FRAGMENT_TYPE_JOURNAL = 3; // ...

}

以及容器的 xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<LinearLayout
android:id="@+id/replaceable_list"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</LinearLayout>

<LinearLayout
android:id="@+id/replaceable_details"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/background" >
</LinearLayout>

</LinearLayout>

所以这段代码不起作用,似乎 fragment 容器中左侧的列表在每个 fragment 中都被替换了,只有位置 0 的 fragment 显示它。 (目前它显示带有“JOURNAL”类型适配器的列表,但它应该显示“AGENDA”类型的列表。

--------------------*但是!...*--------------------

如果我创建不同的 fragment_container 布局文件,并在 ContainerFragment.java 的 onCreateView 和 onViewCreated 中写入 IF 条件,则一切正常。所以:

容器 fragment .java

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL)
return inflater.inflate(R.layout.fragment_container_journal, container, false);
else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES)
return inflater.inflater(R.layout.fragment_container_movies, container, false);
else
return super.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);


FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE);

if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL)
ft.replace(R.id.replaceable_journal_list, frag);
else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES)
ft.replace(R.id.replaceable_movies_list, frag);
else
return;

ft.commit();

我想那是因为在每个 fragment 中,我替换了相同 ID 的 LinearLayout ? (可替换列表)我认为可以为每个 fragment 共享相同的布局文件,并且不想创建 4 个相同的布局文件。但看起来我必须这样做?或者我在这里遗漏了什么?

谢谢你的时间,

最佳答案

虽然回复很晚,但我遇到了同样的问题,我通过使用

解决了这个问题
getChildFragmentManager().beginTransaction()

代替

getActivity().getSupportFragmentManager().beginTransaction()

在这种情况下,我们试图从一个 fragment (附加到 ViewPager 的 fragment 列表中的一个,因此是持有 ViewPager 的 Activity)中进行事务,所以我们必须在这里使用 getChildFragmentManager() 来实现所需结果。

关于android - 具有同一类的多个 fragment 实例的 ViewPager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19757035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com