1

我正在构建一个应用程序,其中使用 ViewPager 和 FragmentStatePagerAdapter 一次显示多个片段。以下是我正在做的事情:

ViewPager 的屏幕截图

public class PageViewActivity extends FragmentActivity {
    protected static final String TAG = "PageViewActivity";
    MyPageAdapter pageAdapter;
    private List<Fragment> fragments;
    private FragmentManager fragmentManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_page_view);

        fragments = getFragments();

        fragmentManager = getSupportFragmentManager();

        pageAdapter = new MyPageAdapter(fragmentManager, fragments);

        ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
        pager.setAdapter(pageAdapter);
        pager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                Log.i(TAG, "Inside onPageSelected....................... "
                        + position);
                ((MyFragment) pageAdapter.getChildAt(position)).updateView();
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                Log.i(TAG, "Inside onPageScrolled... " + arg0);
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                Log.i(TAG, "Inside onPageScrollStateChanged... " + arg0);
            }
        });
    }

    private List<Fragment> getFragments() {
        List<Fragment> fList = new ArrayList<Fragment>();

        fList.add(MyFragment.newInstance("Fragment 1"));
        fList.add(MyFragment.newInstance("Fragment 2"));
        fList.add(MyFragment.newInstance("Fragment 3"));
        fList.add(MyFragment.newInstance("Fragment 4"));
        fList.add(MyFragment.newInstance("Fragment 5"));
        fList.add(MyFragment.newInstance("Fragment 6"));
        fList.add(MyFragment.newInstance("Fragment 7"));

        return fList;
    }

    private class MyPageAdapter extends FragmentStatePagerAdapter {
        private List<Fragment> fragments;

        public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
            super(fm);
            this.fragments = fragments;
        }

        public void setList(List<Fragment> fragments) {
            this.fragments = fragments;
            notifyDataSetChanged();
        }

        @Override
        public Fragment getItem(int position) {
            Log.i(TAG, "Inside getItem............");
            return this.fragments.get(position);
        }

        @Override
        public int getCount() {
            return this.fragments.size();
        }

        @Override
        public float getPageWidth(int position) {
            if (position == 0) {
                return 0.4f;
            } else {
                return 0.3f;
            }
        }

        public Fragment getChildAt(int position) {
            return this.fragments.get(position);
        }

        @Override
        public int getItemPosition(Object object) {
            Log.i(TAG, "getItemPosition..........");
            if (fragments.contains(object)) {
                Log.i(TAG,
                        "fragmentList.contains(object)... " + object.toString());
                return POSITION_UNCHANGED;
            }
            return POSITION_NONE;
        }

                    }
    }
}

我的问题是如何找到哪些片段是可见的?(例如屏幕截图中的片段 1、2 和 3)

我知道 abot pager.setOnPageChangeListenerFragment.setUserVisibleHint(boolean isVisibleToUser)但对我没用:-(

非常感谢您的帮助。谢谢!!!

4

4 回答 4

2

链接可能会有所帮助

使用这行代码 Fragment fr = getSupportFragmentManager().findFragmentByTag(“android:switcher:” + R.id.pager + “:” + mViewPager.getCurrentItem());

于 2015-01-01T05:30:18.603 回答
0

这可能是一个可能的解决方案

暗示

  1. 在您的适配器中编写一个采用整数的函数(即 getCurrentItem 选择适配器的函数输出)。
  2. 使用该位置检查适配器两侧的片段可见性。

    示例: 即当前位置为 3,您一次显示 3 个片段,然后使用 getUserVisibleHint() 方法检查位置 2,1 和 4,5 中的片段是否可见。

  3. 存储可见片段的位置并将其返回到数组中

希望这可以帮助

于 2014-04-02T12:38:49.143 回答
0

看看这两个工作解决方案

也看看这个

由于您将片段存储在其中,因此private List<Fragment> fragments;您可以让其Fragments告诉您每个片段的可见性状态。在Fragment, 之后onStart()调用 Fragment 对用户可见。只需迭代您的所有片段List并使用boolean可见/不可见询问他们

于 2014-04-02T11:33:12.683 回答
0

我愿意:

 for (Fragment frag : getSupportFragmentManager().getFragments()) {
                if (frag instanceof LogbookFragment) {
                    LogbookFragment logFrag = (LogbookFragment) frag;
                    if (logFrag.getUserVisibleHint()) {
                        createDocument(logFrag.data.Trips, sp_swipeType.getSelectedItemPosition(), logFrag._dtStart);
                        break;
                    }
                }
            }
于 2015-10-29T13:29:05.257 回答