版权声明:本文为HaiyuKing原创文章,转载请注明出处!

前言

使用RecyclerView+ViewPager实现类似TabLayout+ViewPager效果。

效果图

使用步骤

一、项目组织结构图

注意事项:

1、  导入类文件后需要change包名以及重新import R文件路径

2、  Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

二、导入步骤

(1)在build.gradle中引用recyclerview【版本号和appcompat保持一致】

  1. apply plugin: 'com.android.application'
  2.  
  3. android {
  4. compileSdkVersion 27
  5. defaultConfig {
  6. applicationId "com.why.project.viewpagerwithrecyclerdemo"
  7. minSdkVersion 16
  8. targetSdkVersion 27
  9. versionCode 1
  10. versionName "1.0"
  11. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
  12. }
  13. buildTypes {
  14. release {
  15. minifyEnabled false
  16. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
  17. }
  18. }
  19. }
  20.  
  21. dependencies {
  22. implementation fileTree(dir: 'libs', include: ['*.jar'])
  23. implementation 'com.android.support:appcompat-v7:27.1.1'
  24. implementation 'com.android.support.constraint:constraint-layout:1.1.2'
  25. testImplementation 'junit:junit:4.12'
  26. androidTestImplementation 'com.android.support.test:runner:1.0.2'
  27. androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
  28.  
  29. //RecyclerView
  30. compile "com.android.support:recyclerview-v7:27.1.1"
  31. }

(2)在项目中实现Recyclerview基本数据展现【顶部选项卡区域】

1、创建Bean类

  1. package com.why.project.viewpagerwithrecyclerdemo.bean;
  2.  
  3. /**
  4. * Created by HaiyuKing
  5. * Used
  6. */
  7.  
  8. public class TabItemBean {
  9. private String tabTitle;
  10. private String tabUrl;
  11.  
  12. public TabItemBean(String tabTitle, String tabUrl){
  13. this.tabTitle = tabTitle;
  14. this.tabUrl = tabUrl;
  15. }
  16.  
  17. public String getTabTitle() {
  18. return tabTitle;
  19. }
  20.  
  21. public void setTabTitle(String tabTitle) {
  22. this.tabTitle = tabTitle;
  23. }
  24.  
  25. public String getTabUrl() {
  26. return tabUrl;
  27. }
  28.  
  29. public void setTabUrl(String tabUrl) {
  30. this.tabUrl = tabUrl;
  31. }
  32. }

TabItemBean.java

2、创建Adapter以及item的布局文件,同时定义颜色、文字大小值

  1. package com.why.project.viewpagerwithrecyclerdemo.adapter;
  2.  
  3. import android.content.Context;
  4. import android.support.v7.widget.RecyclerView;
  5. import android.util.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.ViewGroup;
  9. import android.widget.RelativeLayout;
  10. import android.widget.TextView;
  11.  
  12. import com.why.project.viewpagerwithrecyclerdemo.R;
  13. import com.why.project.viewpagerwithrecyclerdemo.bean.TabItemBean;
  14.  
  15. import java.util.ArrayList;
  16.  
  17. /**
  18. * Created by HaiyuKing
  19. * Used
  20. */
  21.  
  22. public class TabAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
  23.  
  24. /**上下文*/
  25. private Context myContext;
  26. /**集合*/
  27. private ArrayList<TabItemBean> listitemList;
  28.  
  29. private int selectedPosition = -1;//选中的列表项
  30.  
  31. /**
  32. * 构造函数
  33. */
  34. public TabAdapter(Context context, ArrayList<TabItemBean> itemlist) {
  35. myContext = context;
  36. listitemList = itemlist;
  37. }
  38.  
  39. /**
  40. * 获取总的条目数
  41. */
  42. @Override
  43. public int getItemCount() {
  44. return listitemList.size();
  45. }
  46.  
  47. /**
  48. * 创建ViewHolder
  49. */
  50. @Override
  51. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  52. View view = LayoutInflater.from(myContext).inflate(R.layout.tab_list_item, parent, false);
  53. ItemViewHolder itemViewHolder = new ItemViewHolder(view);
  54. return itemViewHolder;
  55. }
  56.  
  57. /**
  58. * 声明grid列表项ViewHolder
  59. */
  60. static class ItemViewHolder extends RecyclerView.ViewHolder {
  61. public ItemViewHolder(View view) {
  62. super(view);
  63.  
  64. listItemLayout = (RelativeLayout) view.findViewById(R.id.listitem_layout);
  65. mTabTitle = (TextView) view.findViewById(R.id.top_title);
  66. mTabUnderLine = (TextView) view.findViewById(R.id.top_underline);
  67. }
  68.  
  69. RelativeLayout listItemLayout;
  70. TextView mTabTitle;
  71. TextView mTabUnderLine;
  72. }
  73.  
  74. /**
  75. * 将数据绑定至ViewHolder
  76. */
  77. @Override
  78. public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int index) {
  79.  
  80. //判断属于列表项
  81. if (viewHolder instanceof ItemViewHolder) {
  82. TabItemBean tabItemBean = listitemList.get(index);
  83. final ItemViewHolder itemViewHold = ((ItemViewHolder) viewHolder);
  84.  
  85. itemViewHold.mTabTitle.setText(tabItemBean.getTabTitle());
  86.  
  87. //设置下划线的宽度值==文本的宽度值
  88. itemViewHold.mTabTitle.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
  89. Log.w("why", "top_title.getMeasuredWidth()="+itemViewHold.mTabTitle.getMeasuredWidth());
  90. itemViewHold.listItemLayout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
  91. Log.w("why", "toptabLayout.getMeasuredWidth()="+itemViewHold.listItemLayout.getMeasuredWidth());
  92. itemViewHold.mTabUnderLine.setWidth(itemViewHold.mTabTitle.getMeasuredWidth());//手动设置下划线的宽度值
  93.  
  94. if(selectedPosition == index){
  95. itemViewHold.mTabTitle.setTextColor(myContext.getResources().getColor(R.color.tab_text_selected_top));
  96. itemViewHold.mTabUnderLine.setBackgroundColor(myContext.getResources().getColor(R.color.tab_auto_selected_top));
  97. }else{
  98. itemViewHold.mTabTitle.setTextColor(myContext.getResources().getColor(R.color.tab_text_normal_top));
  99. itemViewHold.mTabUnderLine.setBackgroundColor(myContext.getResources().getColor(R.color.tab_auto_normal_top));
  100. }
  101.  
  102. //如果设置了回调,则设置点击事件
  103. if (mOnItemClickLitener != null) {
  104. itemViewHold.listItemLayout.setOnClickListener(new View.OnClickListener() {
  105. @Override
  106. public void onClick(View view) {
  107. int position = itemViewHold.getLayoutPosition();//在增加数据或者减少数据时候,position和index就不一样了
  108. mOnItemClickLitener.onItemClick(itemViewHold.listItemLayout, position);
  109. setSelected(position);
  110. }
  111. });
  112. }
  113.  
  114. }
  115. }
  116.  
  117. /**更改选中的列表项下标值*/
  118. public void setSelected(int selected) {
  119. this.selectedPosition = selected;
  120. notifyDataSetChanged();
  121. }
  122.  
  123. /**
  124. * 添加Item--用于动画的展现
  125. */
  126. public void addItem(int position, TabItemBean listitemBean) {
  127. listitemList.add(position, listitemBean);
  128. notifyItemInserted(position);
  129. }
  130.  
  131. /**
  132. * 删除Item--用于动画的展现
  133. */
  134. public void removeItem(int position) {
  135. listitemList.remove(position);
  136. notifyItemRemoved(position);
  137. }
  138.  
  139. /*=====================添加OnItemClickListener回调================================*/
  140. public interface OnItemClickLitener {
  141. void onItemClick(View view, int position);
  142. }
  143.  
  144. private OnItemClickLitener mOnItemClickLitener;
  145.  
  146. public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
  147. this.mOnItemClickLitener = mOnItemClickLitener;
  148. }
  149. }
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- 带有下划线的顶部选项卡子项的布局文件-->
  3. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:id="@+id/listitem_layout"
  5. android:layout_width="wrap_content"
  6. android:layout_height="wrap_content"
  7. android:gravity="center"
  8. android:paddingTop="@dimen/tab_top_auto_padding"
  9. android:paddingLeft="@dimen/tab_top_auto_padding"
  10. android:paddingRight="@dimen/tab_top_auto_padding"
  11. >
  12. <!-- 标题 -->
  13. <TextView
  14. android:id="@+id/top_title"
  15. android:layout_width="wrap_content"
  16. android:layout_height="wrap_content"
  17. android:gravity="center"
  18. android:text=""
  19. android:textSize="@dimen/tab_top_auto_title_size"
  20. android:textColor="@color/tab_text_normal_top"
  21. android:layout_alignParentTop="true"
  22. android:layout_centerHorizontal="true" />
  23. <!-- 下划线-->
  24. <!-- android:background="@color/tab_underline_selected_top" -->
  25. <TextView
  26. android:id="@+id/top_underline"
  27. android:layout_width="match_parent"
  28. android:layout_height="@dimen/tab_top_auto_height"
  29. android:background="@color/tab_auto_normal_top"
  30. android:layout_below="@id/top_title"
  31. android:layout_centerHorizontal="true"
  32. android:layout_marginTop="@dimen/tab_top_auto_padding"
  33. />
  34.  
  35. </RelativeLayout>

tab_list_item.xml

在colors.xml文件中添加以下代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <color name="colorPrimary">#3F51B5</color>
  4. <color name="colorPrimaryDark">#303F9F</color>
  5. <color name="colorAccent">#FF4081</color>
  6.  
  7. <!-- *********************************顶部选项卡区域********************************* -->
  8. <!-- 顶部选项卡下划线背景色 -->
  9. <color name="tab_auto_normal_top">#00ffffff</color>
  10. <color name="tab_auto_selected_top">#3090d9</color>
  11. <!-- 顶部选项卡文本颜色 -->
  12. <color name="tab_text_normal_top">#191919</color>
  13. <color name="tab_text_selected_top">#3090d9</color>
  14. </resources>

在dimens.xml文件中添加以下代码

  1. <resources>
  2. <!-- Default screen margins, per the Android Design guidelines. -->
  3. <dimen name="activity_horizontal_margin">16dp</dimen>
  4. <dimen name="activity_vertical_margin">16dp</dimen>
  5.  
  6. <!-- *********************************顶部选项卡区域********************************* -->
  7. <!-- 选项卡的内边距 -->
  8. <dimen name="tab_top_auto_padding">10dp</dimen>
  9. <!-- 选项卡标题的文字大小 -->
  10. <dimen name="tab_top_auto_title_size">18sp</dimen>
  11. <!-- 选项卡标题的下划线高度 -->
  12. <dimen name="tab_top_auto_height">3dp</dimen>
  13. </resources>

3、在Activity布局文件中引用Recyclerview控件【见下文】

4、在Activity类中初始化recyclerview数据【见下文】

(3)创建需要用到的fragment类和布局文件

(4)引入MyCustomViewPager并参考MyCustomViewPagerAdapter创建viewpager的适配器

  1. package com.why.project.viewpagerwithrecyclerdemo.adapter;
  2.  
  3. import android.support.v4.app.Fragment;
  4. import android.support.v4.app.FragmentManager;
  5. import android.support.v4.app.FragmentStatePagerAdapter;
  6. import android.view.ViewGroup;
  7.  
  8. import java.util.List;
  9.  
  10. /**
  11. * Created by HaiyuKing
  12. * Used
  13. */
  14.  
  15. public class MyTabViewPagerAdapter extends FragmentStatePagerAdapter {
  16.  
  17. /**碎片集合*/
  18. private List<Fragment> fragmentList;
  19.  
  20. public MyTabViewPagerAdapter(FragmentManager fm) {
  21. super(fm);
  22. // TODO Auto-generated constructor stub
  23. }
  24.  
  25. /**
  26. * 自定义构造函数:用于传递碎片集合过来
  27. * 一般都写上*/
  28. public MyTabViewPagerAdapter(FragmentManager fm,List<Fragment> fragmentList) {
  29. super(fm);
  30. this.fragmentList = fragmentList;
  31. }
  32.  
  33. @Override
  34. public Fragment getItem(int arg0) {
  35. // TODO Auto-generated method stub
  36. return fragmentList.get(arg0);
  37. }
  38.  
  39. @Override
  40. public int getCount() {
  41. return fragmentList.size();
  42. }
  43.  
  44. @Override
  45. public void destroyItem(ViewGroup container, int position, Object object) {
  46. //viewpager+fragment来回滑动fragment重新加载的简单解决办法:http://blog.csdn.net/qq_28058443/article/details/51519663
  47. //建议保留,因为首页碎片界面含有6个界面切换,总不能设置setOffscreenPageLimit(6)吧,而且设置个数少的话,销毁后还得重新加载
  48. //super.destroyItem(container, position, object);
  49. }
  50. }

MyTabViewPagerAdapter.java

(5)因为Demo中使用到了webview请求网址,所以需要在AndroidManifest.xml中添加权限

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.why.project.viewpagerwithrecyclerdemo">
  4.  
  5. <!-- ======================授权访问网络(HttpUtil)========================== -->
  6. <!-- 允许程序打开网络套接字 -->
  7. <uses-permission android:name="android.permission.INTERNET"/>
  8.  
  9. <application
  10. android:allowBackup="true"
  11. android:icon="@mipmap/ic_launcher"
  12. android:label="@string/app_name"
  13. android:roundIcon="@mipmap/ic_launcher_round"
  14. android:supportsRtl="true"
  15. android:theme="@style/AppTheme">
  16. <activity android:name=".MainActivity">
  17. <intent-filter>
  18. <action android:name="android.intent.action.MAIN"/>
  19.  
  20. <category android:name="android.intent.category.LAUNCHER"/>
  21. </intent-filter>
  22. </activity>
  23. </application>
  24.  
  25. </manifest>

三、使用方法

(1)在布局文件中引入RecyclerView和MyCustomViewPager【注意,修改MyCustomViewPage的完整路径】

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6.  
  7. <!-- 横向列表 -->
  8. <android.support.v7.widget.RecyclerView
  9. android:id="@+id/tab_top_recycler"
  10. android:layout_width="match_parent"
  11. android:layout_height="wrap_content" />
  12.  
  13. <!-- 横分割线 -->
  14. <View
  15. android:layout_width="match_parent"
  16. android:layout_height="1dp"
  17. android:background="#e9e9e9" />
  18.  
  19. <!-- viewpager区域,配合Fragment使用,且不能滑动 -->
  20. <com.why.project.viewpagerwithrecyclerdemo.viewpager.MyCustomViewPager
  21. android:id="@+id/vp_tab"
  22. android:layout_width="match_parent"
  23. android:layout_height="0dp"
  24. android:layout_weight="1" />
  25.  
  26. </LinearLayout>

(2)在Activity中填充数据,关联RecyclerView和ViewPager

  1. package com.why.project.viewpagerwithrecyclerdemo;
  2.  
  3. import android.os.Bundle;
  4. import android.support.v4.app.Fragment;
  5. import android.support.v4.view.ViewPager;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.support.v7.widget.LinearLayoutManager;
  8. import android.support.v7.widget.RecyclerView;
  9. import android.util.Log;
  10. import android.view.View;
  11.  
  12. import com.why.project.viewpagerwithrecyclerdemo.adapter.MyTabViewPagerAdapter;
  13. import com.why.project.viewpagerwithrecyclerdemo.adapter.TabAdapter;
  14. import com.why.project.viewpagerwithrecyclerdemo.bean.TabItemBean;
  15. import com.why.project.viewpagerwithrecyclerdemo.fragment.WebViewFragment;
  16. import com.why.project.viewpagerwithrecyclerdemo.viewpager.MyCustomViewPager;
  17.  
  18. import java.util.ArrayList;
  19. import java.util.List;
  20.  
  21. public class MainActivity extends AppCompatActivity {
  22. private static final String TAG = MainActivity.class.getSimpleName();
  23.  
  24. //分类列表
  25. private RecyclerView mTabRecycleView;
  26. private ArrayList<TabItemBean> mTabItemBeanArrayList;
  27. private TabAdapter mTabAdapter;
  28.  
  29. /**保存的选项卡的下标值*/
  30. private int savdCheckedIndex = 0;
  31. /**当前的选项卡的下标值*/
  32. private int mCurrentIndex = -1;
  33.  
  34. //横向滚动的ViewPager
  35. private MyCustomViewPager mViewPager;
  36. /**滑屏适配器*/
  37. private MyTabViewPagerAdapter viewPagerAdapter;
  38. /**碎片集合*/
  39. private List<Fragment> fragmentList;
  40. //碎片界面
  41. private WebViewFragment mWebViewFragment;
  42.  
  43. @Override
  44. protected void onCreate(Bundle savedInstanceState) {
  45. super.onCreate(savedInstanceState);
  46. setContentView(R.layout.activity_main);
  47.  
  48. //初始化控件以及设置
  49. initView();
  50. //初始化数据
  51. initData();
  52. //初始化控件的点击事件
  53. initEvent();
  54. }
  55.  
  56. @Override
  57. protected void onResume() {
  58. super.onResume();
  59. Log.e(TAG,"{onResume}savdCheckedIndex="+savdCheckedIndex);
  60. //设置保存的或者初始的选项卡标红显示
  61. setTabsDisplay(savdCheckedIndex);
  62.  
  63. mCurrentIndex = -1;//解决按home键后长时间不用,再次打开显示空白的问题
  64. //设置保存的或者初始的选项卡展现对应的fragment
  65. setFragmentDisplay(savdCheckedIndex);
  66. }
  67.  
  68. /**
  69. * 初始化控件
  70. */
  71. private void initView() {
  72. mTabRecycleView = findViewById(R.id.tab_top_recycler);
  73. mViewPager = (MyCustomViewPager) findViewById(R.id.vp_tab);
  74. }
  75. /**
  76. * 初始化数据
  77. */
  78. public void initData() {
  79. //初始化集合
  80. mTabItemBeanArrayList = new ArrayList<TabItemBean>();
  81.  
  82. mTabItemBeanArrayList.add(new TabItemBean("百度","http://www.baidu.com"));
  83. mTabItemBeanArrayList.add(new TabItemBean("CSDN","http://blog.csdn.net"));
  84. mTabItemBeanArrayList.add(new TabItemBean("博客园","http://www.cnblogs.com"));
  85. mTabItemBeanArrayList.add(new TabItemBean("极客头条","http://geek.csdn.net/mobile"));
  86. mTabItemBeanArrayList.add(new TabItemBean("优设","http://www.uisdc.com/"));
  87. mTabItemBeanArrayList.add(new TabItemBean("玩Android","http://www.wanandroid.com/index"));
  88. mTabItemBeanArrayList.add(new TabItemBean("掘金","https://juejin.im/"));
  89.  
  90. //设置布局管理器【表情分类列表】
  91. LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
  92. mTabRecycleView.setLayoutManager(linearLayoutManager);
  93. //设置适配器
  94. if(mTabAdapter == null){
  95. //设置适配器
  96. mTabAdapter = new TabAdapter(this, mTabItemBeanArrayList);
  97. mTabRecycleView.setAdapter(mTabAdapter);
  98. //添加分割线
  99. //设置添加删除动画
  100. //调用ListView的setSelected(!ListView.isSelected())方法,这样就能及时刷新布局
  101. mTabRecycleView.setSelected(true);
  102. }else{
  103. mTabAdapter.notifyDataSetChanged();
  104. }
  105.  
  106. //将碎片添加到集合中
  107. fragmentList = new ArrayList<>();
  108. for(int i=0;i<mTabItemBeanArrayList.size();i++){
  109. TabItemBean tabItemBean = mTabItemBeanArrayList.get(i);
  110.  
  111. Bundle bundle = new Bundle();
  112. bundle.putString("param", tabItemBean.getTabUrl());
  113. fragmentList.add(WebViewFragment.getInstance(WebViewFragment.class,bundle));
  114. }
  115. //给ViewPager设置适配器
  116. viewPagerAdapter = new MyTabViewPagerAdapter(getSupportFragmentManager(),fragmentList);
  117. mViewPager.setAdapter(viewPagerAdapter);
  118. }
  119.  
  120. /**
  121. * 初始化点击事件
  122. * */
  123. private void initEvent() {
  124. //列表适配器的点击监听事件
  125. mTabAdapter.setOnItemClickLitener(new TabAdapter.OnItemClickLitener() {
  126. @Override
  127. public void onItemClick(View view, int position) {
  128. if (mCurrentIndex == position) {
  129. return;
  130. }
  131. setFragmentDisplay(position);//独立出来,用于OnResume的时候初始化展现相应的Fragment
  132.  
  133. savdCheckedIndex = position;
  134. mCurrentIndex = position;
  135. }
  136. });
  137.  
  138. //viewpager的滑动事件监听
  139. mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
  140. @Override
  141. /*此方法是页面跳转完后得到调用,arg0是你当前选中的页面的Position(位置编号)。*/
  142. public void onPageSelected(int arg0) {
  143. //解决滑动后,无法点击上一个fragment选项卡的问题
  144. setTabsDisplay(arg0);
  145. savdCheckedIndex = arg0;
  146. mCurrentIndex = arg0;
  147. }
  148.  
  149. @Override
  150. /*
  151. * 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回一直得到调用。其中三个参数的含义分别为:
  152. * arg0 :当前页面,及你点击滑动的页面
  153. * arg1:当前页面偏移的百分比
  154. * arg2:当前页面偏移的像素位置 */
  155. public void onPageScrolled(int arg0, float arg1, int arg2) {
  156. // TODO Auto-generated method stub
  157.  
  158. }
  159.  
  160. @Override
  161. /*此方法是在状态改变的时候调用,其中arg0这个参数有三种状态(0,1,2)。
  162. * arg0==0的时候默示什么都没做
  163. * arg0 ==1的时候默示正在滑动
  164. * arg0==2的时候默示滑动完毕了*/
  165. public void onPageScrollStateChanged(int arg0) {
  166. // TODO Auto-generated method stub
  167.  
  168. }
  169. });
  170. }
  171.  
  172. /**
  173. * 设置导航栏中选项卡之间的切换
  174. */
  175. private void setTabsDisplay(int index){
  176. if(mTabAdapter != null){
  177. mTabAdapter.setSelected(index);
  178. mTabRecycleView.smoothScrollToPosition(index);//平移滑动到指定position
  179. }
  180. }
  181.  
  182. /**
  183. * 设置碎片之间的切换
  184. */
  185. private void setFragmentDisplay(int index){
  186. mViewPager.setCurrentItem(index, false);//smoothScroll false表示切换的时候,不经过两个页面的中间页
  187. }
  188.  
  189. /**
  190. * http://blog.csdn.net/caesardadi/article/details/20382815
  191. * */
  192. // 自己记录fragment的位置,防止activity被系统回收时,fragment错乱的问题【按home键返回到桌面一段时间,然后在进程里面重新打开,会发现RadioButton的图片选中状态在第二个,但是文字和背景颜色的选中状态在第一个】
  193. //onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
  194. protected void onSaveInstanceState(Bundle outState) {
  195. //http://www.cnblogs.com/chuanstone/p/4672096.html?utm_source=tuicool&utm_medium=referral
  196. //总是执行这句代码来调用父类去保存视图层的状态”。其实到这里大家也就明白了,就是因为这句话导致了重影的出现
  197. super.onSaveInstanceState(outState);
  198. outState.putInt("selectedCheckedIndex", savdCheckedIndex);
  199. outState.putInt("mCurrentIndex", mCurrentIndex);
  200. }
  201.  
  202. @Override
  203. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  204. savdCheckedIndex = savedInstanceState.getInt("selectedCheckedIndex");
  205. mCurrentIndex = savedInstanceState.getInt("mCurrentIndex");
  206. super.onRestoreInstanceState(savedInstanceState);
  207. }
  208.  
  209. }

混淆配置

参考资料

暂时空缺

项目demo下载地址

https://github.com/haiyuKing/ViewPagerWithRecyclerDemo

ViewPagerWithRecyclerDemo【RecyclerView+ViewPager实现类似TabLayout+ViewPager效果】的更多相关文章

  1. 介绍三个Android支持库控件:TabLayout+ViewPager+RecyclerView

    本文主要介绍如下三个Android支持库控件的配合使用: TabLayout:android.support.design.widget.TabLayout ViewPager:android.sup ...

  2. 011 Android TabLayout+ViewPager实现顶部滑动效果(多个页面)

    1.TabLayout介绍 TabLayout提供了一个水平的布局用来展示Tabs,很多应用都有这样的设计,典型的有网易新闻,简书,知乎等.TabLayout就可以很好的完成这一职责,首先TabLay ...

  3. 浅谈TabLayout(ViewPager+Tab联动)

    google发布了的Android Support Design库中提供了TabLayout 通过TabLayout+ViewPager实现导航栏效果,点击Tab ,ViewPager跟随变化,滑动V ...

  4. 关于tablayout+viewpager+fragment配合使用的一点记录

    最近在写项目的时候遇到要求使用tablayout和fragment,遇到了这里记录一下大致思路. tablayout是头部可以左右切换的头部控制栏控件,配合viewpager使用,fragment是碎 ...

  5. 使用FragmentTabHost+TabLayout+ViewPager实现双层嵌套Tab

    大多数应用程序都会在底部使用3~5个Tab对应用程序的主要功能进行划分,对于一些信息量非常大的应用程序,还需要在每个Tab下继续划分子Tab对信息进行分类显示. 本文实现采用FragmentTabHo ...

  6. [置顶] xamarin Tablayout+Viewpager+Fragment顶部导航栏

    最近几天不忙,所以把项目中的顶部导航栏的实现归集一下.android中使用TabLayout+ViewPager+Fragment制作顶部导航非常常见,代码实现也比较简单.当然我这个导航栏是基于xam ...

  7. Android开发之漫漫长途 Fragment番外篇——TabLayout+ViewPager+Fragment

    该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...

  8. 安卓TabLayout+ViewPager实现切页

    安卓使用TabLayout+ViewPager+Fragment 实现页面切换,可实现左右滑动切换视图界面和点击切换 可自定义菜单栏是在顶部还是在底部 一.实现效果: 二.实现过程: 2.1 一些重要 ...

  9. TabLayout ViewPager Fragment 简介 案例 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. 在本地没有安装Oracle的情况下,使用plsql远程连接数据库

    远程连接数据库的方式不止一种.这里主要写在本地没有安装Oracle的情况下,使用plsql可视化工具远程连接数据库的方式. 一.前提 首先你本地得安装有plsql工具.具体的安装步骤就不多说了. 二. ...

  2. 【最小生成树】Bzoj1601[Usaco2008 Oct]灌水

    Description Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. ...

  3. POJ_3342_Party at Hali-Bula_树形DP

    POJ_3342_Party at Hali-Bula_树形DP 题意:直接上司和本人不能同时参加,求最多参加人数,并回答是否唯一解. 分析:常规树形DP,需要再维护一下选/不选当前点取得最大值时是否 ...

  4. Mysql8.0命令

    1.创建用户 create user 'username'@'localhost' identified by 'pwd' 2.修改访问权限 在mysql数据下修改user表用户host为'%' up ...

  5. WeTest----如何使用WeTest进行App性能测试?

    使用Wetest可以测试手机app的性能,wetest主打游戏app测试,但是对于其余的app仍然适用,手机可以root,也可在非root的情况下进行测试, 此时可以获取的性能数据包括:FPS.整机C ...

  6. MySSL HTTPS 评级 B 升 A+

    背景 MySSL 提供了免费的网站 HTTPS 安全评级服务,然后我用我的网站 https://hellogithub.com,测试了一下.发现安全评级为 B,最高为 A+.下面是记录我的网站从 B ...

  7. 设计模式 | 工厂方法模式(factory method)

    定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 结构:(书中图,侵删) 一个工厂的抽象接口 若干个具体的工厂类 一个需要创建对象的抽象接口 若干个 ...

  8. Spring Boot 入门(六):集成 treetable 和 zTree 实现树形图

    本篇文章是接着Spring Boot 入门(五):集成 AOP 进行日志管理写的,主要集成了树形图,在部门列表或者权限列表中,树形图经常被用上.主要是根据相应的 API 凭借 html 字符串 1.t ...

  9. 瑞芯微RKnanC芯片处理器介绍

    RKnanC是一种低成本.低功耗.高效率的数字多媒体芯片,它是基于ARM的低功耗处理器结构和硬件加速器.它是专为便携式音频产品应用,如MP3播放器等. RKnanC可以支持各种音频标准的解码,如MP3 ...

  10. 安卓开发笔记(二十一):Android Studio如何创建assets目录

    方法如下: 因为在用WebView控件查看安卓内置网页的时候,必须创建这个资源文件夹,将网页放置在这个目录之下,默认是没有assets这个目录的,这样才可以实现网页代码html.css.javascr ...