首页 > 解决方案 > 如何在不触发侦听器的情况下选择选项卡?

问题描述

我有多个标签,让我们说:

  1. 用户向下滑动:它应该根据它所在的类别更改选项卡。
  2. 用户单击选项卡:它应该移动到类别所在视图的顶部。

我的问题是,当我在用户进入某个视图时选择选项卡时,它会触发onTabSelected并滑动到视图的顶部。

有没有办法可以在不触发侦听器的情况下更改选择的选项卡?

这是我的代码

public class Activity extends AppCompatActivity {

    public TabLayout tabLayout;
    public RecyclerView firstView,secondView;
    public NestedScrollView nestedScrollView;
    public RelativeLayout relativeLayout;
    public boolean clicked = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_meat_category);

//removed unimportant codes


        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);

          tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { // I removed the boolean here because I don't know where to change the value of it.
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                if(tabLayout.getSelectedTabPosition() == 0){
                    nestedScrollView.scrollTo(0, firstView.getTop());
                }else if(tabLayout.getSelectedTabPosition() == 1){
                    nestedScrollView.smoothScrollTo(0, secondView.getTop());
                }
            }

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

            }

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

            }
        });

        nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (scrollY <= firstView.getBottom()){
                    tabLayout.getTabAt(0).select();
                    clicked = false;
                } else if (scrollY >= secondView.getTop() && scrollY <= secondView.getBottom() ){
                    tabLayout.getTabAt(1).select();
                    clicked = false;
                }

            }

        });




    }
}

标签: javaandroidtabs

解决方案


我遇到了同样的问题,只需通过下面的代码修复它。首先,我TabLayout.OnTabSelectedListener在课堂上声明该字段 -

private TabLayout.OnTabSelectedListener tabSelectedListener;

 tabSelectedListener = new TabLayout.OnTabSelectedListener() { // I removed the boolean here because I don't know where to change the value of it.
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                if(tabLayout.getSelectedTabPosition() == 0){
                    nestedScrollView.scrollTo(0, firstView.getTop());
                }else if(tabLayout.getSelectedTabPosition() == 1){
                    nestedScrollView.smoothScrollTo(0, secondView.getTop());
                }
            }

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

            }

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

            }
        });

最后,删除tabSelectedListener之前的选择并在选择后再次添加。

nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
                if (scrollY <= firstView.getBottom()){
                    /*First remove it*/
                    tabLayout.removeOnTabSelectedListener(tabSelectedListener);
                    tabLayout.getTabAt(0).select();
                    /*Then add it again*/
                    tabLayout.addOnTabSelectedListener(tabSelectedListener)

                    clicked = false;
                } else if (scrollY >= secondView.getTop() && scrollY <= secondView.getBottom() ){
                     /*First remove it*/
                    tabLayout.removeOnTabSelectedListener(tabSelectedListener);
                    tabLayout.getTabAt(1).select();
                     /*Then add it again*/
                    tabLayout.addOnTabSelectedListener(tabSelectedListener)
                    clicked = false;
                }

            }

        });

推荐阅读