【发布时间】:2018-11-17 07:19:39
【问题描述】:
我有多个标签,假设:
- 用户向下滑动:它应该根据哪个选项卡更改选项卡 它所在的类别。
- 用户点击选项卡:它应该移动 到该类别所在视图的顶部。
我的问题是,当我在用户进入某个视图时选择选项卡时,它会触发 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;
}
}
});
}
}
【问题讨论】:
-
您能否分享您的代码以获取更多信息。
-
您可以暂时删除
OnTabSelectedListener——即致电setOnTabSelectedListener(null)——然后再将其重新设置。或者,您可以保留某种标志变量 - 例如,boolean- 以指示您是否应该在onTabSelected()中添加任何内容。 -
嘿,迈克,谢谢你的建议。我已经尝试过布尔值。如果用户单击选项卡而不是滚动,我很难理解如何更改值。我已经编辑了我的问题。
-
@SavinSharma 我已经更新了!
-
@Kristofer 为什么每次更改选项卡时都将嵌套视图滚动到顶部?这肯定会将视图滑到顶部。