TabLayout选择指定位置,并且滑动到该位置

(2018.7.28)特地来更新:对于之前看到了这篇博客的同仁们,只能说:很抱歉把你们带坑里去了(如果有人看的话)。目前最简单粗暴的实现思路:

利用延时,让view初始化完毕之后,直接通过自身的特点滑动到指定的位置
  tablayout.postDelayed(new Runnable() {
            @Override
            public void run() {
                tablayout.getTabAt(position).select();
            }
        }, 100);

上面的方法对tab的个数没有限制。

实现思路(这个思路是个坑,但是我还是要留在这里):

滑动的距离 = 滑动的位置 x 每个item 的宽度+偏移量

实现代码如下:

   //初始化tablayout数据
    private void initTab() {
        int position = getIntent().getIntExtra("position", 0);
        for (int i = 0, length = titles.length; i < length; i++) {
            TabLayout.Tab tabAt = tablayout.newTab();
            tabAt.setCustomView(R.layout.tab_item_layout);
            TextView tab_title = (TextView) tabAt.getCustomView().findViewById(R.id.title_value);
            tab_title.setGravity(Gravity.CENTER);
            tab_title.setText(titles[i]);
            tablayout.addTab(tabAt);
        }
        setDefaultTable(position, true);
    }

    /**
     * 选择默认的选中项
     *
     * @param position   注意下角标从0开始
     * @param needScroll 仅仅第一次需要滑动
     */
    public void setDefaultTable(int position, boolean needScroll) {
        if (position < 0)
            position = 0;
        if (position >= titles.length)
            position = titles.length - 1;
        tablayout.getTabAt(position).select();
        if (tablayout.getTabAt(position).isSelected()) {
            View customView = tablayout.getTabAt(position).getCustomView();
            TextView tab_title = (TextView) customView.findViewById(R.id.title_value);
            tab_title.setGravity(Gravity.CENTER);

            if (needScroll) {
                int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
                tab_title.measure(spec, spec);
                int measuredWidthTicketNum = tab_title.getMeasuredWidth();
                //   measuredWidthTicketNum = px2dp(measuredWidthTicketNum);
                Log.i("TAG", "条目的宽度是" + measuredWidthTicketNum);
                Log.i("TAG", "mWidth=" + mWidth);
                recomputeTlOffset1(position, measuredWidthTicketNum);
            }
        }
    }

 /**
     * 重新计算需要滚动的距离
     *
     * @param index 选择的tab的下标
     */
    private void recomputeTlOffset1(int index, int viewWidth) {
        if (tablayout.getTabAt(index) != null) tablayout.getTabAt(index).select();
        //加上半个item的宽度(这个需要自己微调,不一定是半个)如果有设置margin还需要加上margin的距离
        int halfWidth = viewWidth / 2; //偏移量
        final int width = ((viewWidth + halfWidth) * index);
        Log.i("TAG", "tablayout.getResources().getDisplayMetrics().density=" + tablayout.getResources().getDisplayMetrics().density);
        Log.i("TAG", "移动的距离是" + width);
        tablayout.post(new Runnable() {
            @Override
            public void run() {
                tablayout.smoothScrollTo(width, 0);
            }
        });
    }

注意:以上代码仅仅对tab的数量在比较少的情况下可以使用(8个左右,而且并不能保证在屏幕的正中间),偏移量的大小取决于item的控件的大小,是不确定的。

你可能感兴趣的:(TabLayout选择指定位置,并且滑动到该位置)