Android ViewPager获取当前视图

lac*_*cas 66 tabs android android-fragments android-viewpager

我有一个ViewPager,我想获得当前选中和可见的视图,而不是位置.

  1. getChildAt(getCurrentItem) 返回错误 View
  2. 这并不是所有的时间.有时返回null,有时只返回错误的View.

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
    
        if (isVisibleToUser == true) { 
            mFocusedListView = ListView; 
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. PageListener上ViewPagergetChildAt()也没有工作,每次都不给我正确的观点.

我怎样才能获得当前可见的视图?

View view = MyActivity.mViewPager.getChildAt(MyActivity.mViewPager.getCurrentItem()).getRootView();
ListView listview = (ListView) view.findViewById(R.id.ListViewItems);
Run Code Online (Sandbox Code Playgroud)

lac*_*cas 122

我已经明白了.我所做的是setTag()用一个名字给所有Views/ListViews打电话findViewWithTag(mytag),然后打电话,mytag作为标签.

不幸的是,没有其他办法可以解决这个问题.

  • +1这个解决方案的荒谬性,但绝对是最好的.在PagerAdapter.instantiateView中使用position作为标记并使用findViewBy(getCurrentItem())检索View是这种hack中最优雅的形式. (11认同)
  • 我不敢相信这是最好的选择,但它确实有效.我只是在适配器创建项目时将索引设置为标记. (7认同)
  • 请告诉我,将近六年后,有更好的方法可以做到这一点! (2认同)

ZeC*_*dea 8

我刚刚遇到同样的问题并通过使用以下方法解决了

View view = MyActivity.mViewPager.getFocusedChild();
Run Code Online (Sandbox Code Playgroud)

  • 这不会一直有效,有时焦点在其他地方甚至是当前显示ViewPager的视图 (5认同)

小智 8

我用这个方法 android.support.v4.view.ViewPager

View getCurrentView(ViewPager viewPager) {
        try {
            final int currentItem = viewPager.getCurrentItem();
            for (int i = 0; i < viewPager.getChildCount(); i++) {
                final View child = viewPager.getChildAt(i);
                final ViewPager.LayoutParams layoutParams = (ViewPager.LayoutParams) child.getLayoutParams();

                Field f = layoutParams.getClass().getDeclaredField("position"); //NoSuchFieldException
                f.setAccessible(true);
                int position = (Integer) f.get(layoutParams); //IllegalAccessException

                if (!layoutParams.isDecor && currentItem == position) {
                    return child;
                }
            }
        } catch (NoSuchFieldException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalArgumentException e) {
            Log.e(TAG, e.toString());
        } catch (IllegalAccessException e) {
            Log.e(TAG, e.toString());
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)


Gil*_*ian 7

您可以通过从适配器调用访问myAdapter.yourListItens.get(myViewPager.getCurrentItem()); itens 列表来获取当前元素.如您所见,ViewPager可以检索适配器元素的当前索引(当前页面).

如果您正在使用FragmentPagerAdapter,则可以执行以下操作:

FragmentPagerAdapter adapter = (FragmentPagerAdapter)myViewPager.getAdapter();
Run Code Online (Sandbox Code Playgroud)

并打电话

adapter.getItem(myViewPager.getCurrentItem());
Run Code Online (Sandbox Code Playgroud)

这对我很有用;)

  • 请注意,``getItem()`应该在子类化`Fragment(State)PagerAdapter`时始终返回Fragment的新实例.因此,这是不对的,因为它只是创建一个新实例而不是返回"旧"实例. (22认同)
  • 仅适用于您的适配器是FragmentPagerAdapter的情况 (2认同)
  • 你的答案返回片段,但对我来说,片段是空的.adapter.getItem(myViewPager.getCurrentItem()).getView()返回null. (2认同)