Tablayout与RecyclerView的联合使用(不用viewpager)

本文介绍了如何在不使用ViewPager的情况下,将TabLayout与RecyclerView进行联合使用。通过这种方式,可以实现Tab切换但无需滑动切换效果,减少了不必要的代码。内容包括布局搭建、Tab设置、利用Glide展示不同类别图片以及RecyclerView适配器的具体操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TabLayout与RecyclerView的联合使用(不使用ViewPager)

前言:TabLayout是Google官方的design-support jar包中的一个组件,一般情况下是与ViewPager共同使用:通过setupWithViewPager将TabLayout与ViewPager关联即可滑动切换,今天说的是TabLayout与RecyclerView的使用,与ViewPager半毛钱关系都没有。

既然不使用ViewPager那么就不会滑动切换了,我项目中确实是这样做的,完全没必要滑动切换啊徒增N++代码….


进入正题:

先上图

1.布局搭建:


  
  
  1. <span style=“font-size:14px;”> <RelativeLayout
  2. xmlns:android= “http://schemas.android.com/apk/res/android”
  3. xmlns:app= “http://schemas.android.com/apk/res-auto”
  4. xmlns:tools= “http://schemas.android.com/tools”
  5. android:layout_width= “match_parent”
  6. android:layout_height= “match_parent”
  7. tools:context= “rain.tablayoutdemo.MainActivity”>
  8. <android.support.design.widget.TabLayout
  9. android:id= “@+id/tlTabTitle”
  10. android:layout_width= “match_parent”
  11. android:layout_height= “40dp”
  12. android:layout_marginBottom= “10dp”
  13. app:tabIndicatorColor= “@color/titleBg”
  14. app:tabMode= “fixed”
  15. app:tabSelectedTextColor= “@color/titleBg”/>
  16. <android.support.v7.widget.RecyclerView
  17. android:id= “@+id/recyclerView”
  18. android:layout_width= “match_parent”
  19. android:layout_height= “match_parent”
  20. android:layout_below= “@+id/tlTabTitle”>
  21. </android.support.v7.widget.RecyclerView>
  22. </RelativeLayout> </span>


2.设置Tab


  
  
  1. <span style= “font-size:14px;”> private String titles[] = new String[]{ “Android”, “IOS”, “PHP”, “Python”, “Html”};
  2. /**
  3. * 设置导航标题
  4. */
  5. private void initTab() {
  6. mTitles.setOnTabSelectedListener(tabSelectedListener);
  7. mTitles.addTab(mTitles.newTab().setText(titles[ 0]).setTag(Constans.TAG_ANDROID));
  8. mTitles.addTab(mTitles.newTab().setText(titles[ 1]).setTag(Constans.TAG_IOS));
  9. mTitles.addTab(mTitles.newTab().setText(titles[ 2]).setTag(Constans.TAG_PHP));
  10. mTitles.addTab(mTitles.newTab().setText(titles[ 3]).setTag(Constans.TAG_PYTHON));
  11. mTitles.addTab(mTitles.newTab().setText(titles[ 4]).setTag(Constans.TAG_HTML));
  12. }</span>

重写TabLayout的监听事件

  
  
  1. <span style= “font-size:14px;”> /**
  2. * 标题选择监听
  3. */
  4. private TabLayout.OnTabSelectedListener tabSelectedListener = new TabLayout.OnTabSelectedListener() {
  5. @Override
  6. public void onTabSelected(TabLayout.Tab tab) {
  7. mListStyle = ( int) tab.getTag();
  8. mRecyclerView.setLayoutManager( new LinearLayoutManager(MainActivity. this, LinearLayoutManager.VERTICAL, false));
  9. mRecyclerView.setAdapter( new mRecyclerViewAdapter(mListStyle, images,MainActivity. this));
  10. mRecyclerView.getAdapter().notifyDataSetChanged();
  11. }
  12. @Override
  13. public void onTabUnselected(TabLayout.Tab tab) {
  14. }
  15. @Override
  16. public void onTabReselected(TabLayout.Tab tab) {
  17. }
  18. };</span>

3. 这里增加了不同类别的图片显示使用了Glide..
具体操作在RecyclerView 适配器.


  
  
  1. <span style= “font-size:14px;”> private List<String> images = new ArrayList<>();
  2. private void initView() {
  3. images.add( 0, “http://i2.buimg.com/574168/3a58750867fa9b72.jpg”);
  4. images.add( 1, “http://i2.buimg.com/574168/de9245f2499a9064.png”);
  5. images.add( 2, “http://i2.buimg.com/574168/08b84aa22853082f.jpg”);
  6. images.add( 3, “http://i2.buimg.com/574168/f4e415b3a3f4d1a5.jpg”);
  7. images.add( 4, “http://i2.buimg.com/574168/24776f28e89758a9.jpg”);
  8. mTitles = (TabLayout) findViewById(R.id.tlTabTitle);
  9. </span> mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
  10. }

4.RecyclerView 适配器


  
  
  1. <span style= “font-size:14px;”> public class mRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
  2. private int mListStyle;
  3. private Context mContext;
  4. private List<String> mImages = new ArrayList<>();
  5. private int size = 20;
  6. private static final int TYPE_ANDROID = 0;
  7. private static final int TYPE_IOS = 1;
  8. private static final int TYPE_PHP = 2;
  9. private static final int TYPE_PYTHON = 3;
  10. private static final int TYPE_HTML = 4;
  11. private static final int TYPE_NODATA = 5;
  12. private static final int TYPE_MORE = 6;
  13. public mRecyclerViewAdapter(int mListStyle, List<String> images, Context context) {
  14. this.mListStyle = mListStyle;
  15. this.mContext = context;
  16. this.mImages = images;
  17. }
  18. @Override
  19. public RecyclerView. ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  20. final LayoutInflater inflater = LayoutInflater.from(mContext);
  21. if (viewType == TYPE_ANDROID || viewType == TYPE_IOS ||
  22. viewType == TYPE_PHP || viewType == TYPE_PYTHON || viewType == TYPE_HTML)
  23. return new ItemViewHolder(inflater.inflate(R.layout.recyclerview_item, parent, false));
  24. if (viewType == TYPE_NODATA)
  25. return new NoDataViewHolder(inflater.inflate(R.layout.recyclerview_item_nodata, parent, false));
  26. return new MoreOrderViewHolder(inflater.inflate(R.layout.recyclerview_item_more, parent, false));
  27. }
  28. @Override
  29. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  30. if (holder instanceof ItemViewHolder)
  31. ((ItemViewHolder) holder).showData();
  32. }
  33. @Override
  34. public int getItemViewType(int position) {
  35. if (size == 0 ) return TYPE_NODATA;
  36. if (mListStyle == Constans.TAG_ANDROID) return TYPE_ANDROID;
  37. if (mListStyle == Constans.TAG_IOS) return TYPE_IOS;
  38. if (mListStyle == Constans.TAG_PHP) return TYPE_PHP;
  39. if (mListStyle == Constans.TAG_PYTHON) return TYPE_PYTHON;
  40. if (mListStyle == Constans.TAG_HTML) return TYPE_HTML;
  41. return TYPE_NODATA;
  42. }
  43. @Override
  44. public int getItemCount() {
  45. if (size == 0) return 1;
  46. return 20;
  47. }
  48. private class ItemViewHolder extends RecyclerView.ViewHolder {
  49. private final ImageView mImage;
  50. private final TextView mContent;
  51. public ItemViewHolder(View view) {
  52. super(view);
  53. mImage = (ImageView) view.findViewById(R.id.imvImageView);
  54. mContent = (TextView) view.findViewById(R.id.txvContent);
  55. }
  56. public void showData() {
  57. switch (mListStyle) {
  58. case Constans.TAG_ANDROID:
  59. ImageCacheManager.show(mContext,mImages.get( 0),mImage);
  60. mContent.setText( “Android”);
  61. break;
  62. case Constans.TAG_IOS:
  63. ImageCacheManager.show(mContext,mImages.get( 1),mImage);
  64. mContent.setText( “IOS”);
  65. break;
  66. case Constans.TAG_PHP:
  67. ImageCacheManager.show(mContext,mImages.get( 2),mImage);
  68. mContent.setText( “PHP”);
  69. break;
  70. case Constans.TAG_PYTHON:
  71. ImageCacheManager.show(mContext,mImages.get( 3),mImage);
  72. mContent.setText( “Python”);
  73. break;
  74. case Constans.TAG_HTML:
  75. ImageCacheManager.show(mContext,mImages.get( 4),mImage);
  76. mContent.setText( “Html”);
  77. break;
  78. }
  79. }
  80. }
  81. private class NoDataViewHolder extends RecyclerView.ViewHolder {
  82. public NoDataViewHolder(View view) {
  83. super(view);
  84. }
  85. }
  86. private class MoreOrderViewHolder extends RecyclerView.ViewHolder {
  87. public MoreOrderViewHolder(View view) {
  88. super(view);
  89. }
  90. }
  91. }</span>



这里以展示不同类型的Item为例,代码很简单,不做过多讲解…

关于Glide使用,这里我写了一个帮助类,ImageCacheManager ,不管使用Glide还是Picasso简单修改即可使用(详见代码)



最后:这是我个人搭建的博客,欢迎访问… 我的博客链接





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值