java - 如何在不触发侦听器的情况下选择选项卡?
问题描述
我有多个标签,让我们说:
- 用户向下滑动:它应该根据它所在的类别更改选项卡。
- 用户单击选项卡:它应该移动到类别所在视图的顶部。
我的问题是,当我在用户进入某个视图时选择选项卡时,它会触发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;
}
}
});
}
}
解决方案
我遇到了同样的问题,只需通过下面的代码修复它。首先,我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;
}
}
});
推荐阅读
- reactjs - React:将 javascript 与 jsx 混合
- python - 登录到 Aruba 的 NBAPI for Mobility Master 但请求失败
- python - 从 Celery 任务产生的子进程永远不会终止并且 proc.poll() == None 状态一直保持
- java - 从 JSONArray 的一个元素创建 Java Array
- angular - Angular 7 Universal:无法将简单的 Http 请求加载到 Express 服务器(SSR)
- amazon-web-services - 为 API 网关的用户使用 API 密钥对
- php - 为什么使用 PHP 在 MySQLi 中运行 multi_query 后显示所有记录不起作用但单个查询可以?
- urbancode - IBM UCD - 目录偏移
- python - 在命令行中执行 Jupyter notebook
- vb.net - 将 VS 2005 项目转换为 VS 2017 后的类实例化问题