├── .gitignore ├── .idea ├── .name ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── dictionaries │ └── ice.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── modules.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── top │ │ └── wefor │ │ └── materialshow │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── top │ │ │ └── wefor │ │ │ └── materialshow │ │ │ ├── FoodListFragment.java │ │ │ ├── HomeFragment.java │ │ │ ├── MainActivity.java │ │ │ ├── NestedListActivity.java │ │ │ └── TabPagerPresenter.java │ └── res │ │ ├── drawable │ │ ├── ic_search_white_24dp.xml │ │ └── ic_share_white_24dp.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ ├── activity_nested_list.xml │ │ ├── fragment_home.xml │ │ ├── lay_collapsing_viewpager_toolbar_immerse.xml │ │ └── lay_recycler_view.xml │ │ ├── menu │ │ └── main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── img_huoer.jpeg │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-v19 │ │ └── dimens.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── top │ └── wefor │ └── materialshow │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | Material Show -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/dictionaries/ice.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 22 | 23 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | 26 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 58 | 59 | 60 | 61 | 62 | 63 | 68 | 69 | 70 | 71 | 72 | 73 | 1.8 74 | 75 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MaterialShow 2 | Material Design 优雅处理复杂视图 3 | 4 | ### 介绍: 5 | http://www.jianshu.com/p/e64a4e08f57a 6 | 7 | ### 我的简书: 8 | http://www.jianshu.com/users/e36e60b5af17/latest_articles 9 | 10 | ### 主要实现 11 | 利用Android最新控件实现: 12 | * 保持ViewPager中Fragment的状态。 13 | * 快速绑定已有数据的TabLayout与ViewPager。 14 | * 在Fragment中显示标题栏,并为该标题栏添加菜单。 15 | * Fragment嵌套Fragment。 16 | * 一行代码解决RecyclerView等视图的滚动冲突。 17 | * 为Fragment中的头部视图(含图片)实现沉浸式。 18 | * 最简单的沉浸式版本适配。 19 | 20 | ### 效果图 21 | ![使用Martial Design优雅实现](http://upload-images.jianshu.io/upload_images/2066824-b58f96c2b4dc80ec.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/540/h/960) 22 | 23 | ### 要点解读 24 | ``` 25 | // 保存ViewPager中Fragment的状态 26 | mViewPager.setOffscreenPageLimit(mFragments.size()); 27 | ``` 28 | ``` 29 | // 在Fragment中显示标题栏,并为该标题栏添加菜单。 30 | mToolbar.inflateMenu(R.menu.main); 31 | mToolbar.setOnMenuItemClickListener(this); 32 | ``` 33 | 34 | ``` 35 | // 快速绑定已有数据的TabLayout与ViewPager。 36 | mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); 37 | mTabLayout.addOnTabSelectedListener(this); 38 | ``` 39 | 40 | ``` 41 | // Fragment中ViewPager嵌套Fragment,需要注意传入的FragmentMangager(),不然子Fragment可能无法显示。 42 | mViewPager.setAdapter(new FragmentStatePagerAdapter(getChildFragmentManager()... 43 | ``` 44 | 45 | ``` 46 | // 一行代码解决RecyclerView等视图的滚动冲突,具体请看[源码](https://github.com/XunMengWinter/MaterialShow/tree/master) 。 47 | app:layout_behavior="@string/appbar_scrolling_view_behavior" 48 | ``` 49 | 50 | ``` 51 | // 为Fragment中的头部视图(含图片)实现沉浸式。 52 | 53 | 59 | // 为该Fragment所在的Activity设定该主题,会带来一些输入框问题,但是由于AppBar是在Fragment里面,如果在Activity里面的话直接设定为上面的主题就可以实现头部图片沉浸式了。 60 | 63 | ``` 64 | 65 | ``` 66 | // 最简单的沉浸式版本适配,请看源码。 67 | 68 | // 为ToolBar设置MarginTop. 69 | android:layout_marginTop="@dimen/height_status_bar" 70 | //在 dimen.xml 文件中添加 71 | 0dp 72 | //在 dimen.xml(v19) 文件中添加 73 | 22dp 74 | 75 | // p.s 这样一来安卓4.4以上toolbar就距离顶部22dp了,而比4.4低的版本是没有沉浸式这一概念的,所以设为0dp就好。 76 | 77 | ``` 78 | 79 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'android-apt' 3 | 4 | android { 5 | compileSdkVersion 24 6 | buildToolsVersion "24.0.0" 7 | 8 | defaultConfig { 9 | applicationId "top.wefor.materialshow" 10 | minSdkVersion 16 11 | targetSdkVersion 24 12 | versionCode 1 13 | versionName "1.0" 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | } 22 | 23 | dependencies { 24 | final SUPPORT_LIBRARY_VERSION = '24.0.0' 25 | final BUTTER_KNIFE_VERSION = '8.1.0' 26 | 27 | compile fileTree(dir: 'libs', include: ['*.jar']) 28 | testCompile 'junit:junit:4.12' 29 | compile "com.android.support:appcompat-v7:$SUPPORT_LIBRARY_VERSION" 30 | compile "com.android.support:design:$SUPPORT_LIBRARY_VERSION" 31 | 32 | // Butter Knife 33 | compile "com.jakewharton:butterknife:$BUTTER_KNIFE_VERSION" 34 | apt "com.jakewharton:butterknife-compiler:$BUTTER_KNIFE_VERSION" 35 | } 36 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/ice/Library/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/top/wefor/materialshow/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package top.wefor.materialshow; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/src/main/java/top/wefor/materialshow/FoodListFragment.java: -------------------------------------------------------------------------------- 1 | package top.wefor.materialshow; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v4.app.Fragment; 6 | import android.support.v4.widget.SwipeRefreshLayout; 7 | import android.support.v7.widget.LinearLayoutManager; 8 | import android.support.v7.widget.RecyclerView; 9 | import android.view.LayoutInflater; 10 | import android.view.View; 11 | import android.view.ViewGroup; 12 | import android.widget.TextView; 13 | 14 | import java.util.ArrayList; 15 | 16 | import butterknife.BindView; 17 | import butterknife.ButterKnife; 18 | 19 | /** 20 | * Created on 16/6/30. 21 | * 22 | * @author ice 23 | */ 24 | public class FoodListFragment extends Fragment { 25 | public static int sTimes = 0; 26 | 27 | @BindView(R.id.refreshLayout) SwipeRefreshLayout mRefreshLayout; 28 | @BindView(R.id.recyclerView) RecyclerView mRecyclerView; 29 | 30 | @Nullable 31 | @Override 32 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 33 | View view = inflater.inflate(R.layout.lay_recycler_view, null); 34 | ButterKnife.bind(this, view); 35 | return view; 36 | } 37 | 38 | @Override 39 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 40 | super.onViewCreated(view, savedInstanceState); 41 | if (sTimes % 2 == 0) { 42 | mRefreshLayout.setEnabled(false); 43 | } 44 | sTimes++; 45 | mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 46 | @Override 47 | public void onRefresh() { 48 | mRefreshLayout.postDelayed(new Runnable() { 49 | @Override 50 | public void run() { 51 | mRefreshLayout.setRefreshing(false); 52 | } 53 | }, 3000); 54 | } 55 | }); 56 | 57 | mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 58 | mRecyclerView.setHasFixedSize(true); 59 | 60 | final ArrayList strings = new ArrayList<>(); 61 | for (int i = 1; i < 100; i++) { 62 | String name = "I Know You " + i; 63 | strings.add(name); 64 | } 65 | 66 | mRecyclerView.setAdapter(new RecyclerView.Adapter() { 67 | @Override 68 | public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 69 | int px32 = 32; 70 | TextView textView = new TextView(getActivity()); 71 | textView.setPadding(px32, px32, px32, px32); 72 | 73 | return new RecyclerView.ViewHolder(textView) { 74 | @Override 75 | public String toString() { 76 | return super.toString(); 77 | } 78 | }; 79 | } 80 | 81 | @Override 82 | public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 83 | TextView textView = (TextView) holder.itemView; 84 | textView.setText(strings.get(position)); 85 | } 86 | 87 | @Override 88 | public int getItemCount() { 89 | return strings.size(); 90 | } 91 | }); 92 | 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /app/src/main/java/top/wefor/materialshow/HomeFragment.java: -------------------------------------------------------------------------------- 1 | package top.wefor.materialshow; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.design.widget.AppBarLayout; 7 | import android.support.design.widget.CollapsingToolbarLayout; 8 | import android.support.design.widget.TabLayout; 9 | import android.support.v4.app.Fragment; 10 | import android.support.v4.app.FragmentStatePagerAdapter; 11 | import android.support.v4.view.ViewPager; 12 | import android.support.v7.widget.AppCompatTextView; 13 | import android.support.v7.widget.Toolbar; 14 | import android.view.LayoutInflater; 15 | import android.view.MenuItem; 16 | import android.view.View; 17 | import android.view.ViewGroup; 18 | import android.widget.ImageView; 19 | import android.widget.Toast; 20 | 21 | import java.util.ArrayList; 22 | 23 | import butterknife.BindView; 24 | import butterknife.ButterKnife; 25 | 26 | /** 27 | * Created on 16/6/30. 28 | * 29 | * @author ice 30 | */ 31 | public class HomeFragment extends Fragment implements Toolbar.OnMenuItemClickListener { 32 | 33 | // 记得使用ButterKnife自动生成以下代码 34 | @BindView(R.id.banner_imageView) ImageView mBannerImageView; 35 | @BindView(R.id.title_tv) AppCompatTextView mTitleTv; 36 | @BindView(R.id.toolbar) Toolbar mToolbar; 37 | @BindView(R.id.collapsing_toolbar) CollapsingToolbarLayout mCollapsingToolbar; 38 | @BindView(R.id.tabLayout) TabLayout mTabLayout; 39 | @BindView(R.id.app_bar_layout) AppBarLayout mAppBarLayout; 40 | @BindView(R.id.viewPager) ViewPager mViewPager; 41 | 42 | ArrayList mFragments; 43 | 44 | @Nullable 45 | @Override 46 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 47 | View view = inflater.inflate(R.layout.fragment_home, null); 48 | ButterKnife.bind(this, view); 49 | return view; 50 | } 51 | 52 | @Override 53 | public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 54 | super.onViewCreated(view, savedInstanceState); 55 | 56 | mToolbar.inflateMenu(R.menu.main); // 添加菜单 57 | mToolbar.setOnMenuItemClickListener(this); 58 | 59 | if (mFragments == null) { 60 | mFragments = new ArrayList<>(); 61 | mFragments.add(new FoodListFragment()); 62 | mFragments.add(new FoodListFragment()); 63 | } 64 | 65 | mViewPager.setAdapter(new FragmentStatePagerAdapter(getChildFragmentManager()) { 66 | @Override 67 | public Fragment getItem(int position) { 68 | return mFragments.get(position); 69 | } 70 | 71 | @Override 72 | public int getCount() { 73 | return mFragments.size(); 74 | } 75 | }); 76 | 77 | new TabPagerPresenter(mTabLayout, mViewPager).bindHasData(); 78 | } 79 | 80 | @Override 81 | public boolean onMenuItemClick(MenuItem menuItem) { 82 | switch (menuItem.getItemId()) { 83 | case R.id.action_search: 84 | showToast("search"); 85 | return true; 86 | case R.id.action_share: 87 | showToast("share"); 88 | Intent intent = new Intent(Intent.ACTION_SEND); 89 | intent.setType("text/plain"); 90 | intent.putExtra(Intent.EXTRA_TEXT, "分享一篇不错的文章:Material Design初露锋芒之复杂视图处理" + 91 | " \n" + "http://www.jianshu.com/p/e64a4e08f57a"); 92 | intent.putExtra(Intent.EXTRA_SUBJECT, "Dream Winter"); 93 | intent = Intent.createChooser(intent, "Share to"); 94 | startActivity(intent); 95 | return true; 96 | case R.id.action_nested_list: 97 | startActivity(new Intent(getActivity(),NestedListActivity.class)); 98 | return true; 99 | } 100 | return false; 101 | } 102 | 103 | private void showToast(String msg) { 104 | Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show(); 105 | } 106 | 107 | } 108 | -------------------------------------------------------------------------------- /app/src/main/java/top/wefor/materialshow/MainActivity.java: -------------------------------------------------------------------------------- 1 | package top.wefor.materialshow; 2 | 3 | import android.os.Bundle; 4 | import android.support.design.widget.TabLayout; 5 | import android.support.v4.app.Fragment; 6 | import android.support.v4.app.FragmentStatePagerAdapter; 7 | import android.support.v4.view.ViewPager; 8 | import android.support.v7.app.AppCompatActivity; 9 | 10 | import java.util.ArrayList; 11 | 12 | import butterknife.BindView; 13 | import butterknife.ButterKnife; 14 | 15 | public class MainActivity extends AppCompatActivity { 16 | 17 | @BindView(R.id.viewPager) ViewPager mViewPager; 18 | @BindView(R.id.tabLayout) TabLayout mTabLayout; 19 | 20 | ArrayList mFragments; 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.activity_main); 26 | ButterKnife.bind(this); 27 | 28 | if (mFragments == null) { 29 | mFragments = new ArrayList<>(); 30 | mFragments.add(new HomeFragment()); 31 | mFragments.add(new Fragment()); 32 | mFragments.add(new Fragment()); 33 | } 34 | 35 | mViewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) { 36 | @Override 37 | public Fragment getItem(int position) { 38 | return mFragments.get(position); 39 | } 40 | 41 | @Override 42 | public int getCount() { 43 | return mFragments.size(); 44 | } 45 | }); 46 | 47 | mViewPager.setOffscreenPageLimit(mFragments.size()); 48 | new TabPagerPresenter(mTabLayout, mViewPager).bindHasData(); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/src/main/java/top/wefor/materialshow/NestedListActivity.java: -------------------------------------------------------------------------------- 1 | package top.wefor.materialshow; 2 | 3 | import android.os.Bundle; 4 | import android.support.annotation.Nullable; 5 | import android.support.v4.widget.NestedScrollView; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.support.v7.widget.LinearLayoutManager; 8 | import android.support.v7.widget.RecyclerView; 9 | import android.support.v7.widget.Toolbar; 10 | import android.util.Log; 11 | import android.view.View; 12 | import android.view.ViewGroup; 13 | import android.widget.ImageView; 14 | import android.widget.LinearLayout; 15 | import android.widget.TextView; 16 | 17 | import java.util.ArrayList; 18 | 19 | import butterknife.BindView; 20 | import butterknife.ButterKnife; 21 | 22 | /** 23 | * Created on 16/7/18. 24 | * 25 | * @author ice 26 | */ 27 | public class NestedListActivity extends AppCompatActivity { 28 | 29 | @BindView(R.id.recyclerView) RecyclerView mRecyclerView; 30 | @BindView(R.id.toolbar) Toolbar mToolbar; 31 | @BindView(R.id.imageView) ImageView mImageView; 32 | @BindView(R.id.nestedScrollView) NestedScrollView mNestedScrollView; 33 | @BindView(R.id.statusBar_bg_view) View mStatusBarBgView; 34 | @BindView(R.id.titleBar_bg_view) View mTitleBarBgView; 35 | @BindView(R.id.topBar_layout) LinearLayout mTopBarLayout; 36 | 37 | private float mTopBarHeight; 38 | 39 | @Override 40 | protected void onCreate(@Nullable Bundle savedInstanceState) { 41 | super.onCreate(savedInstanceState); 42 | setContentView(R.layout.activity_nested_list); 43 | ButterKnife.bind(this); 44 | 45 | mTopBarLayout.post(new Runnable() { 46 | @Override 47 | public void run() { 48 | mTopBarHeight = mTopBarLayout.getMeasuredHeight(); 49 | mNestedScrollView.scrollTo(0, 0); 50 | } 51 | }); 52 | 53 | mNestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { 54 | @Override 55 | public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 56 | Log.i("xyz", "xyz " + scrollX + " " + scrollY + " " + oldScrollX + " " + oldScrollY); 57 | if (scrollY < mTopBarHeight) { 58 | mStatusBarBgView.setAlpha(scrollY / mTopBarHeight); 59 | mTitleBarBgView.setAlpha(scrollY / mTopBarHeight); 60 | } 61 | } 62 | }); 63 | 64 | LinearLayoutManager layoutManager = new LinearLayoutManager(this); 65 | mRecyclerView.setLayoutManager(layoutManager); 66 | mRecyclerView.setHasFixedSize(true); 67 | 68 | final ArrayList strings = new ArrayList<>(); 69 | for (int i = 1; i < 100; i++) { 70 | String name = "Hello Summer " + i; 71 | strings.add(name); 72 | } 73 | 74 | mRecyclerView.setAdapter(new RecyclerView.Adapter() { 75 | @Override 76 | public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 77 | int px32 = 32; 78 | TextView textView = new TextView(NestedListActivity.this); 79 | textView.setPadding(px32, px32, px32, px32); 80 | 81 | return new RecyclerView.ViewHolder(textView) { 82 | @Override 83 | public String toString() { 84 | return super.toString(); 85 | } 86 | }; 87 | } 88 | 89 | @Override 90 | public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 91 | TextView textView = (TextView) holder.itemView; 92 | textView.setText(strings.get(position)); 93 | } 94 | 95 | @Override 96 | public int getItemCount() { 97 | return strings.size(); 98 | } 99 | }); 100 | 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /app/src/main/java/top/wefor/materialshow/TabPagerPresenter.java: -------------------------------------------------------------------------------- 1 | package top.wefor.materialshow; 2 | 3 | import android.support.design.widget.TabLayout; 4 | import android.support.v4.view.ViewPager; 5 | import android.util.Log; 6 | 7 | /** 8 | * 处理TabLayout与ViewPager 9 | *

10 | * Created on 16/6/30. 11 | * 12 | * @author ice, GitHub: https://github.com/XunMengWinter 13 | */ 14 | public class TabPagerPresenter { 15 | 16 | private TabLayout mTabLayout; 17 | private ViewPager mViewPager; 18 | 19 | public TabPagerPresenter(TabLayout tabLayout, ViewPager viewPager) { 20 | mTabLayout = tabLayout; 21 | mViewPager = viewPager; 22 | } 23 | 24 | /*快速绑定含数据的二者*/ 25 | public void bindHasData() { 26 | // adding functionality to tab and viewpager to manage each other when a page is changed or when a tab is selected 27 | mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout)); 28 | 29 | mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 30 | @Override 31 | public void onTabSelected(TabLayout.Tab tab) { 32 | Log.i("xyz", "pos " + mTabLayout.getSelectedTabPosition()); 33 | mViewPager.setCurrentItem(mTabLayout.getSelectedTabPosition(), true); 34 | } 35 | 36 | @Override 37 | public void onTabUnselected(TabLayout.Tab tab) { 38 | 39 | } 40 | 41 | @Override 42 | public void onTabReselected(TabLayout.Tab tab) { 43 | 44 | } 45 | }); 46 | } 47 | 48 | 49 | } 50 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_search_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_share_white_24dp.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 16 | 17 | 24 | 25 | 30 | 31 | 36 | 37 | 42 | 43 | 44 | 45 | 46 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_nested_list.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 13 | 14 | 18 | 19 | 25 | 26 | 29 | 35 | 36 | 37 | 38 | 39 | 40 | 45 | 46 | 51 | 52 | 55 | 56 | 61 | 62 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_home.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 17 | 18 | -------------------------------------------------------------------------------- /app/src/main/res/layout/lay_collapsing_viewpager_toolbar_immerse.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 16 | 17 | 25 | 26 | 27 | 34 | 35 | 45 | 47 | 52 | 53 | 54 | 55 | 56 | 64 | 65 | 69 | 70 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /app/src/main/res/layout/lay_recycler_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/src/main/res/menu/main.xml: -------------------------------------------------------------------------------- 1 | 2 |

5 | 6 | 11 | 12 | 17 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XunMengWinter/MaterialShow/314e36c56f6e180fa7743c5230ad0e903a180f46/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XunMengWinter/MaterialShow/314e36c56f6e180fa7743c5230ad0e903a180f46/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XunMengWinter/MaterialShow/314e36c56f6e180fa7743c5230ad0e903a180f46/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/img_huoer.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XunMengWinter/MaterialShow/314e36c56f6e180fa7743c5230ad0e903a180f46/app/src/main/res/mipmap-xhdpi/img_huoer.jpeg -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XunMengWinter/MaterialShow/314e36c56f6e180fa7743c5230ad0e903a180f46/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/XunMengWinter/MaterialShow/314e36c56f6e180fa7743c5230ad0e903a180f46/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/values-v19/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 22dp 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | @color/google_green 4 | @color/google_green 5 | @color/google_orange 6 | 7 | 8 | #cc34a853 9 | 10 | #4285f4 11 | #ea4335 12 | #fbbc05 13 | #34a853 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 6 | 7 | 0dp 8 | 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Material Show 3 | 4 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 18 | 19 | 22 | 23 | 27 | 28 |