标签: fragmentstatepageradapter

FragmentPagerAdapter和FragmentStatePagerAdapter有什么区别?

FragmentPagerAdapter和之间有什么区别FragmentStatePagerAdapter

关于FragmentPagerAdapterGoogle的指南说:

此版本的寻呼机最适合在有少量通常更多静态片段进行分页时使用,例如一组选项卡.用户访问的每个页面的片段将保留在内存中,但其视图层次结构可能在不可见时被销毁.这可能导致使用大量内存,因为片段实例可以保持任意数量的状态.对于较大的页面集,请考虑FragmentStatePagerAdapter.

关于FragmentStatePagerAdapter:

当存在大量页面时,此版本的寻呼机更有用,更像列表视图.当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态.与FragmentPagerAdapter在页面之间切换时可能更多的开销相比,这允许寻呼机保持与每个被访问页面相关联的更少的存储器 .

所以我只有3个片段.但它们都是具有大量数据的独立模块.

Fragment1处理一些数据(用户输入)并通过活动传递给它Fragment2,这很简单ListFragment.Fragment3也是一个ListFragment.

所以我的问题是:我应该使用哪种适配器?FragmentPagerAdapter还是FragmentStatePagerAdapter

android android-fragments android-viewpager fragmentpageradapter fragmentstatepageradapter

357
推荐指数
5
解决办法
11万
查看次数

从API 27中不推荐使用FragmentStatePagerAdapter

FragmentStatePagerAdapter已从API 27中弃用。的替代方案是FragmentStatePagerAdapter什么?

private class MainPagerAdapter extends FragmentStatePagerAdapter {

        MainPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment result = new DummyFragment();
             return result;
        }

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

    }
Run Code Online (Sandbox Code Playgroud)

上面的代码显示FragmentStatePagerAdaptergetItemsuper(fm);已弃用

android android-support-library fragmentstatepageradapter

29
推荐指数
6
解决办法
2万
查看次数

更改屏幕方向后,从ViewPager的适配器中销毁项目

所以我ViewPager在屏幕方向改变后从屏幕中删除(删除)一个页面时出现问题.我将尝试在以下几行中描述问题.

我正在使用FragmentStatePagerAdapter适配器ViewPager和一个小接口来描述无限视图寻呼机应该如何工作.它背后的想法是你可以滚动到右边,直到你到达结束ViewPager.如果您可以从API调用加载更多结果,则会显示进度页面,直到结果出现.

一切都很好,直到现在,问题来了.如果在这个加载过程中,我旋转屏幕(这不会影响API调用,这基本上是一个AsyncTask),当调用返回时,应用程序崩溃给我这个异常:

E/AndroidRuntime(13471): java.lang.IllegalStateException: Fragment ProgressFragment{42b08548} is not currently in the FragmentManager
E/AndroidRuntime(13471):    at android.support.v4.app.FragmentManagerImpl.saveFragmentInstanceState(FragmentManager.java:573)
E/AndroidRuntime(13471):    at android.support.v4.app.FragmentStatePagerAdapter.destroyItem(FragmentStatePagerAdapter.java:136)
E/AndroidRuntime(13471):    at mypackage.OutterFragment$PagedSingleDataAdapter.destroyItem(OutterFragment.java:609)
Run Code Online (Sandbox Code Playgroud)

在库的代码中挖掘了一下之后,似乎mIndex片段的数据字段小于0这种情况,这就引发了异常.

以下是寻呼机适配器的代码:

static class PagedSingleDataAdapter extends FragmentStatePagerAdapter implements
        IEndlessPagerAdapter {

    private WeakReference<OutterFragment> fragment;
    private List<DataItem> data;
    private SparseArray<WeakReference<Fragment>> currentFragments = new SparseArray<WeakReference<Fragment>>();

    private ProgressFragment progressElement;

    private boolean isLoadingData;

    public PagedSingleDataAdapter(SherlockFragment fragment, List<DataItem> data) {
        super(fragment.getChildFragmentManager());
        this.fragment = new WeakReference<OutterFragment>(
                (OutterFragment) fragment);
        this.data = data; …
Run Code Online (Sandbox Code Playgroud)

android android-viewpager android-pageradapter fragmentstatepageradapter

24
推荐指数
1
解决办法
3万
查看次数

使用 FragmentStateAdapter 删除 viewPager2 中的片段,但仍显示

我有viewPager2和FragmentStateAdapter,还有Fragement1,2,3 4,我在fragment2,想去掉fragment3,在fragment2后显示fragment4。问题是它总是向我显示 fragment3(data),调试显示 fragment3 已被删除,但显示的页面仍然有 fragment3 内容。

适配器:

class TipsAdapter(
private val items: MutableList<TripPage>,
context: FragmentActivity
) : FragmentStateAdapter(context) {

private val fragmentFactory = context.supportFragmentManager.fragmentFactory
private val classLoader = context.classLoader

override fun getItemCount(): Int = items.size

override fun createFragment(position: Int): Fragment {
    val pageInfo = items[position]
    val fragment = fragmentFactory.instantiate(classLoader, pageInfo.fragmentClass.name)
    fragment.arguments = Bundle().also { it.putParcelable(PAGE_INFO, pageInfo) }
    return fragment
}

fun getFragmentName(position: Int) = items[position].fragmentClass.simpleName

fun removeFragment(position: Int) {
    items.removeAt(position)
    notifyItemRemoved(position)
    notifyItemRangeChanged(position, items.size)
    notifyDataSetChanged()
}
Run Code Online (Sandbox Code Playgroud)

}

删除片段代码:

      if ((view_pager.adapter …
Run Code Online (Sandbox Code Playgroud)

android android-viewpager fragmentstatepageradapter android-viewpager2

23
推荐指数
1
解决办法
7360
查看次数

Android setUserVisibleHint永远不会被调用?

我需要知道我的片段何时可​​见,我正在使用setMenuVisibility但我现在知道它不是一个好选择.我正在尝试在FragmentStatePagerAdapter片段上实现setUserVisibleHint,但它永远不会被调用.

import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;


public class Contacts extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            View view = inflater.inflate(R.layout.fragment_screen_contacts, container, false);
            return view;
        }


    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        Log.d("MyFragment", "This never shows up.");
        Toast.makeText(getActivity(), "Neither does this", Toast.LENGTH_LONG).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在运行API级别19,并在我的AndroidManifest上设置了最低API级别15.有什么办法可以获得setUserVisibleHint,我做错了什么?

android android-fragments fragmentstatepageradapter

16
推荐指数
2
解决办法
1万
查看次数

在ViewPager中滑动方向

我有一个使用ViewPager和FragmentStatePagerAdapter的Android应用程序.然而,我需要添加一个新功能,我必须知道滑动方向从一个片段视图移动到另一个,左或右.(也就是说,当我向左滑动时,我会做一件事,当我向右滑动时,我会做其他事情).

请注意,我不需要在滑动结束后发生事件.滑动发生时我必须做这些事件.我想过使用setOnPageChangeListener()但它并没有告诉我滑动方向.你能告诉我如何找出滑动方向吗?

谢谢.

android direction swipe android-viewpager fragmentstatepageradapter

15
推荐指数
3
解决办法
2万
查看次数

在ViewPager中仅加载一个片段

我用ViewPagerFragment.
但它一次加载两页.
有没有办法在viewpager中只加载一个页面?

android android-fragments android-viewpager fragmentstatepageradapter

13
推荐指数
2
解决办法
2万
查看次数

带有 Viewpager2 的关键 FragmentStateAdapter 不再存在 Fragment

我正在为我的项目使用 ViewPager2。我需要在带有 viewpager2 的片段中使用嵌套片段。在我尝试在片段(不是嵌套片段)之间导航之前,它就像魅力一样。

第一次在片段之间导航后,应用程序崩溃并显示下面解释的错误。

包含嵌套片段 OnCreateView 方法的片段:

View view = inflater.inflate(R.layout.orders_fragment, null);

ViewPager2 viewPager = view.findViewById(R.id.childViewPager);

TabLayout tabs = view.findViewById(R.id.tabs);

SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager(),getLifecycle());

viewPager.setAdapter(sectionsPagerAdapter);

TabLayoutMediator.TabConfigurationStrategy tabConfigurationStrategy = (tab, position) -> {

    String[] order_activity_tabs = getResources().getStringArray(R.array.situations);

    for (int i=0; i<order_activity_tabs.length; i++) {

        if(i==position)
            tab.setText(order_activity_tabs[i]);

    }
};

TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tabs, viewPager, tabConfigurationStrategy);
tabLayoutMediator.attach();

return view;
Run Code Online (Sandbox Code Playgroud)

当我返回包含嵌套片段的片段时,它会崩溃

 java.lang.IllegalStateException: Fragment no longer exists for key f#0: unique id 4fbe17b8-5e22-4e07-a543-4a79445ad39c
        at androidx.fragment.app.FragmentManagerImpl.getFragment(FragmentManagerImpl.java:365)
        at androidx.viewpager2.adapter.FragmentStateAdapter.restoreState(FragmentStateAdapter.java:549)
        at androidx.viewpager2.widget.ViewPager2.restorePendingState(ViewPager2.java:350)
        at androidx.viewpager2.widget.ViewPager2.dispatchRestoreInstanceState(ViewPager2.java:375)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4045) …
Run Code Online (Sandbox Code Playgroud)

android android-adapter android-fragments fragmentstatepageradapter android-viewpager2

13
推荐指数
1
解决办法
4616
查看次数

在ViewPager中动态跳过页面

我得到了一个ViewPager持有Fragments via FragmentStatePagerAdapter.让我们说寻呼机最初持有以下页面Fragment:

A - B - C - D
Run Code Online (Sandbox Code Playgroud)

当用户刷卡,他可以从移动AB,BC等,但也有情况下,当用户改变某些选项A页,他不能移动到B,但是C:

A - C - D
Run Code Online (Sandbox Code Playgroud)

然后用户返回A,修改某些内容并重新启用B:

A - B - C - D
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这种非常动态的行为?我无法Fragment在用户更改内容时随时添加s,然后重新填充ViewPager,因为它很慢并且会中断流程.

android android-adapter android-fragments android-viewpager fragmentstatepageradapter

11
推荐指数
1
解决办法
2719
查看次数

FragmentStatePagerAdapter内存泄漏(带有viewpager的嵌套片段)

我的适配器中有"内存泄漏"(引用将在后面解释).我目前正在使用嵌套片段来托管viewpager.

我的设置如下:
1.活动(托管片段A的空活动)
2.片段A - 使用Fragmentstatepageradapter托管viewpager的片段.每个viewpager页面都包含片段B.
3.片段B - 包含imageview的片段.

除非发生配置更改,否则一切都很好.监控堆,每次轮换发生时,它似乎增长100 kb.手动GCing不会释放内存.

我尝试过的事情:
1.用空白片段替换片段B - 出现同样的问题,因此不是造成问题的imageview.
2.删除片段A和B并旋转活动.没有发生内存泄漏,所以它不是活动.
3.在任何方向改变之前使用MAT并且在旋转大约50次之后使用MAT以使堆积起来.MAT显示了一个主要的嫌疑人,这是我的适配器类.它显示了7MB的保留堆(非常小的浅堆)观察者,如下所示:

array java.util.ArrayList @ 0x42079938 24 7,000,832 
.\mObservers android.database.DataSetObservable @ 0x42053508 16 7,000,848 
..\mObservable com.example.main.Adapter@ 0x4205a048 40 7,001,416 
Run Code Online (Sandbox Code Playgroud)

为什么我在片段中使用viewpager:
1.我想通过设置setretaininstance(true)来保持适配器的状态以及与viewpager相关的其他变量.
2.配置更改后,我不重新创建适配器,而是使用旧的适配器连接到viewpager.
3.如果我不重用旧适配器但在配置更改后创建新适配器,则内存泄漏消失.
4.关闭活动并返回上一个活动后,内存泄漏也消失了.

有任何想法吗?非常感谢任何帮助.

谢谢,JC

android memory-leaks android-viewpager fragmentstatepageradapter

10
推荐指数
1
解决办法
5622
查看次数