检查ViewPager适配器中的选项卡位置

时间:2016-08-23 13:38:13

标签: android android-fragments android-viewpager android-adapter

奇怪的是,没有一种方法可以在viewPager适配器中获取所选标签的确切位置,

instantiateItem中,您需要确定viewPager中给定标签使用的布局,但position的{​​{1}}实际上并不是确切的位置,那么我该如何决定哪个标签被选中并决定要膨胀的xml?

针对同一问题,有很多SO问题已经得到解答,而且它们在Q1都没有意义。

在这个给定的Question中,当我的情况下布局已经膨胀时,获取所选标签位置是没有意义的。

我的尝试:

  • 通过致电instantiateItem中的getItemPosition()来取得职位并不工作,始终为-1。

  • 使用instantiateItem中的实际position参数获取标签的位置,不会给出奇怪的随机值。

任何解决方案/解决方法?

修改

立即使用HorizontalCoordinatorNtbActivity.java使用活动代码的链接,特别检查第55行

3 个答案:

答案 0 :(得分:0)

如果您将TablayoutviewPager一起使用,则此方法可以为您提供帮助。 tabLayout.getSelectedTabPosition()

如果您需要Tab的文本

String tabText=tabLayout.getTabAt(tabLayout.getSelectedTabPosition()).getText().toString();

答案 1 :(得分:0)

  

奇怪的是,没有一种方法可以获得准确的位置   viewPager适配器中选定选项卡的选项

适配器对适配器视图的状态一无所知,甚至更多 - 它不应该知道这种视图的存在。适配器的唯一目的是准备将由某些东西显示的数据。

如果您的适配器必须知道当前ViewPager的位置 - 这肯定意味着您的设计存在缺陷。

答案 2 :(得分:0)

  position的{​​p> instantiateItem实际上并不是确切的位置

我认为你的意思是position不是目前选择/显示的位置。

显示的是什么视图并不重要。当用户从第1页滑到第2页时,ViewPager会加载第3页的视图,以预期下一次用户滑动。

这是一件好事™。这意味着用户将获得更平滑的滑动操作,因为视图已经被夸大了。

因此,当ViewPager向您的适配器询问第3页的视图时,请为其提供第3页的视图。

现在,当选择/显示视图 时,您可能需要执行一些特殊操作。在这种情况下,你可以检查这个问题的答案(我的答案就是其中之一):

android - How to determine when Fragment becomes visible in ViewPager - Stack Overflow

  

任何解决方案/解决方法?

解决方案是:

  • ViewPager要求您的适配器查看特定标签的视图时,请对该视图进行充气。

  • 当视图成为当前选定/显示的视图时,根据需要更新视图。

编辑:

寻呼机适配器代码并不神秘或其他:

        @Override
        public Object instantiateItem(final ViewGroup container, final int position) {

            View view;
            switch (position) {
            case 0: // teacher
                // inflate/set up your teacher view
                break;
            case 1: // student
                // inflate/set up your student view
                break;
            case 2: // search
                // inflate/set up your search view
                break;
            case 3: // chat
                // inflate/set up your chat view
                break;
            default:
                throw new IllegalArgumentException("I don't know how to set up tab " + position);
            }

            container.addView(view);
            return view;
        }
    });

这真实地显示了@Serhio试图说的内容:您不需要知道ViewPager当前显示的视图;当它向你的适配器询问视图时,你只需给它想要的视图。

而且顺便说一下,当您在寻呼机适配器内部扩展视图时,请确保使用container作为父级:

        view = LayoutInflater.from(
                    getBaseContext()).inflate(R.layout.item_vp_list, container, false);