ViewPager addOnPageChangeListener不适用于同一选项卡 [英] ViewPager addOnPageChangeListener not working on same tabClick

查看:248
本文介绍了ViewPager addOnPageChangeListener不适用于同一选项卡的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个ViewPageraddOnPageChangeListener. ViewPager具有3个选项卡视图(tab1,tab2,tab3).当用户单击tab2时,它将加载一些数据(基本上是RecyclerView).此时,如果用户再次单击tab2,则需要重新加载数据,但在这种情况下不会触发addOnPageChangeListener.

I have a ViewPager with addOnPageChangeListener. ViewPager has 3 tabviews (tab1, tab2, tab3). When a user clicks tab2, it loads some data (Basically it a RecyclerView). At this moment, if user again clicks tab2, I need to reload the data but in this case addOnPageChangeListener is not triggered.

我的代码:

customPagerAdapter = new CustomPagerAdapter(getSupportFragmentManager(), MainActivity.this);
viewPager.setAdapter(customPagerAdapter);

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    public void onPageScrollStateChanged(int state) {
    }

    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    public void onPageSelected(int position) {
        Log.i("TAG", "position: " + position);
        switch (position) {
            case 0:
                addingMarker(LocationData.find(LocationData.class, "Category = ? ", "1"));
                break;
            case 1:
                addingMarker(LocationData.find(LocationData.class, "Category = ? ", "2"));
                break;
            case 2:
                addingMarker(LocationData.find(LocationData.class, "Category = ? ", "3"));
                break;
        }
    }
});
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setupWithViewPager(viewPager);

推荐答案

原始答案:

Android团队已更改了有关TabLayout和ViewPager如何相互通信的一些内容. 阅读文档.但是事情解释得不好.我在代码中包含了很多注释.希望对您有所帮助.

The Android team has changed a few things about how TabLayout and ViewPager talk to each other. Read the docs. But things are not explained well. I've included a lot of comments in the code. I hope that helps.

final ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
Adapter adapter = new Adapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);

// the tabs will get their titles from the adapter and get populated
tabLayout.setTabsFromPagerAdapter(adapter);

// this is done "so that the tab position is kept in sync"
// what it does is when you swipe the fragment in view pager, it updates the tabs
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

// without this listener the tabs would still get updated when fragments are swiped, but ....  (read the next comment)
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        Toast.makeText(MainActivity.this, "tabSelected:  " + tab.getText(), Toast.LENGTH_SHORT).show();
        // no where in the code it is defined what will happen when tab is tapped/selected by the user
        // this is why the following line is necessary
        // we need to manually set the correct fragment when a tab is selected/tapped
        // and this is the problem in your code
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {

    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {
        Toast.makeText(MainActivity.this, "tabReSelected:  " + tab.getText(), Toast.LENGTH_SHORT).show();

        // Reload your recyclerView here
    }
});

如果您愿意,请查看此问题还有其他问题.

Check out this issue if you have got any other problems.

2015年12月

不是此问题的解决方案,但总体上很有帮助.

tabLayout.setupWithViewPager(viewPager);

这样,您无需担心在选择选项卡时自行设置片段.在这种情况下,不再需要tabLayout.setOnTabSelectedListener(..).在

This way you don't need to worry about setting the fragment yourself when a tab is selected. tabLayout.setOnTabSelectedListener(..) is no longer needed in this situation. That is handled under the hood. This is useful when you don't need too much control over your tabs(like reloading fragment when same tab is selected/tapped).

更新:2018年5月

tabLayout.setTabsFromPagerAdapter(adapter);
tabLayout.setOnTabSelectedListener(...);

以上两个功能均已弃用.初始化viewpager + tablayout,如下所示:

Both of the above functions are deprecated. Initialize viewpager+tablayout as shown below:

viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager); // this will automatically bind tab clicks to viewpager fragments
viewPager.addOnPageChangeListener(TabLayout.TabLayoutOnPageChangeListener(tabLayout))

// do additional tab clicks here
// no need to manually set viewpager item based on tab click
tabLayout.addOnTabSelectedListener(...);

这篇关于ViewPager addOnPageChangeListener不适用于同一选项卡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆