代码之家  ›  专栏  ›  技术社区  ›  Prithvi Bhola

如何将TabLayout与Recyclerview同步?

  •  2
  • Prithvi Bhola  · 技术社区  · 6 年前

    我有一个 TabLayout 具有 Recyclerview 所以当点击标签时 回收服务 滚动到特定位置。 我也要反向操作,这样当 回收服务 滚动到特定位置,然后突出显示特定选项卡。

    例如:如果 表布局 什么时候 回收服务 滚动到第5个位置(项目可见和下方 表布局 )然后第三个标签应该突出显示。 enter image description here

    当“工作原理”出现在下面时 表布局 然后应该突出显示“How it works”选项卡。

    1 回复  |  直到 6 年前
        1
  •  9
  •   AskNilesh    6 年前

    试试这个

    遵循以下步骤

    1. 添加 ScrollListener 给你的 RecyclerView
    2. 找到你的第一个可见项目 回收服务
    3. 在中设置“选择”选项卡 TabLayout 根据你的位置 回收服务

    示例代码

        myRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
    
                int itemPosition=linearLayoutManager.findFirstCompletelyVisibleItemPosition();
    
                if(itemPosition==0){ //  item position of uses
                    TabLayout.Tab tab = myTabLayout.getTabAt(Index);
                    tab.select();
                }else if(itemPosition==1){//  item position of side effects 
                    TabLayout.Tab tab = myTabLayout.getTabAt(Index);
                    tab.select();
                }else if(itemPosition==2){//  item position of how it works
                    TabLayout.Tab tab = myTabLayout.getTabAt(Index);
                    tab.select();
                }else if(itemPosition==3){//  item position of precaution 
                    TabLayout.Tab tab = myTabLayout.getTabAt(Index);
                    tab.select();
                }
            }
        });
    

    编辑

    public class MyActivity extends AppCompatActivity {
    
    
        RecyclerView myRecyclerView;
        TabLayout myTabLayout;
        LinearLayoutManager linearLayoutManager;
        ArrayList<String> arrayList = new ArrayList<>();
        DataAdapter adapter;
        private boolean isUserScrolling = false;
        private boolean isListGoingUp = true;
    
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my);
    
            myTabLayout = findViewById(R.id.myTabLayout);
    
    
    
            myRecyclerView = findViewById(R.id.myRecyclerView);
            linearLayoutManager = new LinearLayoutManager(this);
            myRecyclerView.setLayoutManager(linearLayoutManager);
            myRecyclerView.setHasFixedSize(true);
    
            for (int i = 0; i < 120; i++) {
                arrayList.add("Item " + i);
            }
    
            adapter= new DataAdapter(this,arrayList);
            myRecyclerView.setAdapter(adapter);
    
            myTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
                @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    isUserScrolling = false ;
                    int position = tab.getPosition();
                    if(position==0){
                        myRecyclerView.smoothScrollToPosition(0);
                    }else if(position==1){
                        myRecyclerView.smoothScrollToPosition(30);
                    }else if(position==2){
                        myRecyclerView.smoothScrollToPosition(60);
                    }else if(position==3){
                        myRecyclerView.smoothScrollToPosition(90);
                    }
                }
    
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
    
                }
    
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
    
                }
            });
            myRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
                        isUserScrolling = true;
                        if (isListGoingUp) {
                            //my recycler view is actually inverted so I have to write this condition instead
                            if (linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1 == arrayList.size()) {
                                Handler handler = new Handler();
                                handler.postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                                        if (isListGoingUp) {
                                            if (linearLayoutManager.findLastCompletelyVisibleItemPosition() + 1 == arrayList.size()) {
                                                Toast.makeText(MyActivity.this, "exeute something", Toast.LENGTH_SHORT).show();
                                            }
                                        }
                                    }
                                }, 50);
                                //waiting for 50ms because when scrolling down from top, the variable isListGoingUp is still true until the onScrolled method is executed
                            }
                        }
                    }
    
                }
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
    
                    int itemPosition = linearLayoutManager.findFirstVisibleItemPosition();
    
    
                    if(isUserScrolling){
                        if (itemPosition == 0) { //  item position of uses
                            TabLayout.Tab tab = myTabLayout.getTabAt(0);
                            tab.select();
                        } else if (itemPosition == 30) {//  item position of side effects
                            TabLayout.Tab tab = myTabLayout.getTabAt(1);
                            tab.select();
                        } else if (itemPosition == 60) {//  item position of how it works
                            TabLayout.Tab tab = myTabLayout.getTabAt(2);
                            tab.select();
                        } else if (itemPosition == 90) {//  item position of precaution
                            TabLayout.Tab tab = myTabLayout.getTabAt(3);
                            tab.select();
                        }
                    }
    
    
    
                }
            });
    
    
        }
    
    
    }