alibaba / vlayout

Project vlayout is a powerfull LayoutManager extension for RecyclerView, it provides a group of layouts for RecyclerView. Make it able to handle a complicate situation when grid, list and other layouts in the same recyclerview.
http://tangram.pingguohe.net/
MIT License
10.8k stars 1.79k forks source link

关于TabLayout+Viewpager的问题 #213

Closed NeVaDaAAA closed 6 years ago

NeVaDaAAA commented 7 years ago

您好 首先这是一个非常好的库,他帮我解决了复杂界面布局的工作,条理清晰,逻辑明确。 我现在遇到一个问题,我的页面的第三个块要用到TabLayout+Viewpager,当我设置Viewpager的layout_height设置match_parent和wrap_content时,页面只显示TabLayout。当设置固定高度的时候,Viewpager可以显示。 我的Viewpager里面是Fragment+RecyclerView,所以不能设置固定高度,请问如何解决这一问题呢?

第三块布局如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical">

<com.ogaclejapan.smarttablayout.SmartTabLayout
    android:id="@+id/test_tab"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    app:stl_defaultTabTextColor="@color/white"
    app:stl_defaultTabTextHorizontalPadding="24dp"
    app:stl_defaultTabTextAllCaps="false"
    app:stl_indicatorColor="@color/white"
    app:stl_indicatorCornerRadius="1.5dp"
    app:stl_defaultTabTextSize="16sp"
    android:background="@drawable/shape"
    app:stl_indicatorInterpolation="smart"
    app:stl_indicatorThickness="3dp"
    app:stl_dividerColor="@color/transparent"
    app:stl_underlineColor="@color/transparent"
    app:tabTextAppearance="@android:style/TextAppearance.Holo.Medium" />

<android.support.v4.view.ViewPager
    android:id="@+id/test_viewpager"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<!--<FrameLayout-->
    <!--android:id="@+id/test_fm"-->
    <!--android:layout_width="match_parent"-->
    <!--android:layout_height="500dp" />-->

Java代码如下: private void initTab() { BaseDelegateAdapter tabAdapter = new BaseDelegateAdapter(getActivity(), new LinearLayoutHelper(), R.layout.collect_tab, 1, TAB_VIEW_TYPE) { @Override public void onBindViewHolder(BaseViewHolder helper, int position) { super.onBindViewHolder(helper, position); SmartTabLayout tab = helper.getView(R.id.test_tab); ViewPager viewPager = helper.getView(R.id.test_viewpager);

            String[] titles = {
                    "App",
                    "Android",
                    "iOS",
                    "前端",
                    "瞎推荐",
                    "拓展资源",
                    "休息视频"};

            CommonViewPagerAdapter viewPagerAdapter = new CommonViewPagerAdapter(getChildFragmentManager());

            // App
            CollectFragment appFragment = CollectFragment.newInstance(titles[0]);
            viewPagerAdapter.addFragment(titles[0], appFragment);
            // Android
            CollectFragment androidFragment = CollectFragment.newInstance(titles[1]);
            viewPagerAdapter.addFragment(titles[1], androidFragment);
            // iOS
            CollectFragment iOSFragment = CollectFragment.newInstance(titles[2]);
            viewPagerAdapter.addFragment(titles[2], iOSFragment);
            // 前端
            CollectFragment frontFragment = CollectFragment.newInstance(titles[3]);
            viewPagerAdapter.addFragment(titles[3], frontFragment);
            // 瞎推荐
            CollectFragment referenceFragment = CollectFragment.newInstance(titles[4]);
            viewPagerAdapter.addFragment(titles[4], referenceFragment);
            // 拓展资源
            CollectFragment resFragment = CollectFragment.newInstance(titles[5]);
            viewPagerAdapter.addFragment(titles[5], resFragment);

            // 休息视频
            CollectFragment videoFragment = CollectFragment.newInstance(titles[6]);
            viewPagerAdapter.addFragment(titles[6], videoFragment);

            viewPager.setOffscreenPageLimit(7);
            viewPager.setAdapter(viewPagerAdapter);
            tab.setViewPager(viewPager);
        }
    };

    mAdapters.add(tabAdapter);
}
longerian commented 7 years ago

Viewpager 默认是不支持wrap_content的, 而vlayout期望又是item自己计算好高度来,所以最好还是能确定一个高度,采用比例计算或者动态下发数据控制高度来解决。

如果这个viewpager是页面主体,最好是反过来使用,在viewpager里的每一页里使用vlayout,tabbar等内容就写到页面布局里。

douya40 commented 7 years ago

我也遇到这个问题不能联动,不知道怎实现

longerian commented 6 years ago

@douya40 联动不在这个的实现范围内啊。

biaomingzhong commented 6 years ago

是不是可以实现自定义 LayoutHelper 来实现这个功能,经常会使用在一个 Activity 的列表底部是 切换 TabLayout + ViewPager , 这个组合嵌在这个 列表 的底部并且 ViewPager 里面的多个 Fragment 都是有瀑布流。这个Activity 内的父控件列表要滑动到 切换 TabLayout 吸顶后就不会继续下滑,开始滑动 ViewPager 的内容。

biaomingzhong commented 6 years ago

@longerian 求解

longerian commented 6 years ago

也许是可以的。先想想方案吧。

yonglf commented 6 years ago

@NeVaDaAAA 我也有这样的需求 请问你解决了吗

932707629 commented 5 years ago

有比较好的解决方案了嘛 咱微信群是多少呀