Collapsing/Expanding view coordinated with Sliding RecyclerView

前端 未结 2 1504
暖寄归人
暖寄归人 2020-12-30 08:41

I am trying to achieve the following affect (also see image below):

  • the app opens with a view (map) partially visible and the RecyclerView at a de
相关标签:
2条回答
  • 2020-12-30 08:44

    To create this we need 1 Activity and 3 Fragments.

    The Activity will host a TabLayout and a ViewPager like so:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.design.widget.TabLayout
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </LinearLayout>
    

    Since we only need to do the sliding behavior for the 1st Fragment the first Fragment gets an XML layout like so:

    <android.support.design.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/appBarLayout"
            android:layout_width="match_parent"
            android:layout_height="400dp"
            android:orientation="vertical"
            android:fitsSystemWindows="true">
    
            <android.support.design.widget.CollapsingToolbarLayout
                android:id="@+id/collapsingToolbar"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:fitsSystemWindows="true"
                app:layout_scrollFlags="scroll|exitUntilCollapsed"
                app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    
                <com.google.android.gms.maps.MapView
                    android:id="@+id/mapView"
                    app:layout_collapseMode="parallax"
                    android:layout_height="400dp"
                    android:layout_width="match_parent" />
    
            </android.support.design.widget.CollapsingToolbarLayout>
    
        </android.support.design.widget.AppBarLayout>
    
        <FrameLayout
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    
    
    </android.support.design.widget.CoordinatorLayout>
    

    You can make the other Fragments however you like I just created fake data and a simple RecyclerView in the other Fragments.

    Then call these views in your Activity and Fragment like so:

    Activity

    public class MainActivity extends AppCompatActivity {
    
        private TabLayout mTabLayout;
        private ViewPager mViewPager;
        private SampleViewPagerAdapter mViewPagerAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.another_activity);
    
            mTabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
            mViewPager = (ViewPager) findViewById(R.id.viewpager);
            mViewPagerAdapter = new SampleViewPagerAdapter(getSupportFragmentManager());
            mViewPager.setAdapter(mViewPagerAdapter);
            mTabLayout.setupWithViewPager(mViewPager);
        }
    
    }
    

    ViewPager Adapter

    public class SampleViewPagerAdapter extends FragmentPagerAdapter {
    
        public SampleViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new MapFragment();
                case 1:
                    return new ScrollFragment();
                case 2:
                    return new ScrollFragment();
                default:
                    return new ScrollFragment();
            }
        }
    
        @Override
        public int getCount() {
            return 3;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            String[] tabNames = {"Stops", "Planner", "Alerts"};
            return tabNames[position];
        }
    
    }
    

    Map Fragment with Sliding RecyclerView

    public class MapFragment extends Fragment {
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View root = inflater.inflate(R.layout.activity_main, null);
    
            initCollapsingToolbar(root);
            // Initialize map
            initFragment();
            return root;
        }
    
        private void initCollapsingToolbar(View root) {
            CollapsingToolbarLayout collapsingToolbarLayout =
                (CollapsingToolbarLayout) root.findViewById(R.id.collapsingToolbar);
            collapsingToolbarLayout.setContentScrimColor(getResources().getColor(R.color.cyan_500));
        }
    
        private void initFragment() {
            FakeDataFragment fragment = new FakeDataFragment();
            getChildFragmentManager().beginTransaction()
                    .replace(R.id.content, scrollFragment)
                    .commit();
        }
    
    }
    

    You should get something like this then:

    Setting the position:

    You can programmatically collapse the toolbar (CollapsingToolbarLayout) using the following code:

    public void collapseToolbar(){
        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) mFrameLayout.getLayoutParams();
        AppBarLayout.ScrollingViewBehavior behavior = (AppBarLayout.ScrollingViewBehavior) params.getBehavior();
        if (behavior != null) {
            behavior.onNestedFling(rootLayout, appbarLayout, null, 0, 10000, true);
        }
    }
    

    This means when the User first sees the map the map is partially collapsed to your Default State.

    0 讨论(0)
  • 2020-12-30 09:03

    I Found Solution for Tabs in CoordinatorLayout

     <?xml version="1.0" encoding="utf-8"?>
    
    
            <android.support.design.widget.CoordinatorLayout                                                                          xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:id="@+id/htab_maincontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true">
    
            <android.support.design.widget.AppBarLayout
                android:id="@+id/htab_appbar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fitsSystemWindows="true"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    
                <android.support.design.widget.CollapsingToolbarLayout
                    android:id="@+id/htab_collapse_toolbar"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:fitsSystemWindows="true"
                    app:layout_scrollFlags="scroll|enterAlways|snap"
                    app:statusBarScrim="@null"
                    app:titleEnabled="false">
    
                    <LinearLayout
                        android:id="@+id/isprofile"
                        android:layout_width="match_parent"
                        android:layout_height="180dp"
                        android:background="@drawable/profile_cover"
                        android:gravity="center"
                        app:layout_collapseMode="parallax">
    
                        <LinearLayout
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_gravity="center"
                            android:layout_marginBottom="10dp"
                            android:gravity="center"
                            android:orientation="vertical">
    
    
                            <com.root.findagame.utills.CircleImageView
                                android:id="@+id/profile_pic"
                                android:layout_width="60dp"
                                android:layout_height="60dp"
                                android:background="@drawable/profile_pic" />
    
                            <TextView
                                android:id="@+id/txtUserName"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:text=""
                                android:textColor="@color/cpb_white"
                                android:textSize="@dimen/text_medium_size"
                                android:textStyle="bold" />
    
                            <TextView
                                android:id="@+id/txtAge"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center"
    
                                android:text=""
                                android:textColor="@color/cpb_white"
                                android:textSize="@dimen/text_small_size" />
    
    
                            <TextView
                                android:id="@+id/txtName"
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center"
                                android:text=""
                                android:textColor="@color/cpb_white"
                                android:textSize="@dimen/text_small_size"
                                android:visibility="gone" />
    
                        </LinearLayout>
                    </LinearLayout>
    
                    <android.support.v7.widget.Toolbar
                        android:id="@+id/htab_toolbar"
                        android:layout_width="match_parent"
                        android:layout_height="40dp"
                        android:visibility="gone"
                        app:layout_collapseMode="pin"
                        app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
                        app:popupTheme="@style/AppTheme.PopupOverlay" />
    
    
                </android.support.design.widget.CollapsingToolbarLayout>
                <android.support.design.widget.TabLayout
                    android:id="@+id/htab_tabs"
                    android:layout_width="match_parent"
                    android:layout_height="40dp"
                    android:layout_gravity="bottom"
                    android:background="@color/cpb_white"
                    app:layout_collapseMode="pin"
                    app:tabIndicatorColor="#7CC142"
                    app:tabSelectedTextColor="#7CC142"
                    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                    app:tabTextAppearance="@android:style/TextAppearance.Widget.TabWidget"
                    app:tabTextColor="@color/lightGrayColor" />
    
            </android.support.design.widget.AppBarLayout>
    
    
            <android.support.v4.view.ViewPager
                android:id="@+id/htab_viewpager"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_behavior="@string/appbar_scrolling_view_behavior" />
    
        </android.support.design.widget.CoordinatorLayout>
    
    
    
    
    
    
    *Fragment*
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/dummyfrag_bg"
        android:layout_width="match_parent"
    
        android:layout_height="match_parent">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/dummyfrag_scrollableview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false" />
    
    </FrameLayout>
    
    0 讨论(0)
提交回复
热议问题