热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

中值_CoordinatorLayout+ViewPager+RecyclerView+自定义TabLayout布局

篇首语:本文由编程笔记#小编为大家整理,主要介绍了CoordinatorLayout+ViewPager+RecyclerView+自定义TabLayout布局相关的知识,希望对你有一定的参考价

篇首语:本文由编程笔记#小编为大家整理,主要介绍了CoordinatorLayout+ViewPager+RecyclerView+自定义TabLayout布局相关的知识,希望对你有一定的参考价值。



首先看看效果确定是不是你想要的:

如果效果是你想要的,那就接着往下看吧,我会一一介绍


(1)整体布局:

布局采用CoordinatorLayout+ViewPager+RecyclerView+自定义TabLayout实现,其中CoordinatorLayout为可上下滚动部分,ViewPager作为左右切换部分,tablayout作为标签部分

先给出整体布局的xml代码:

<android.support.design.widget.CoordinatorLayout
android:layout_below&#61;"&#64;&#43;id/rel_home"
android:layout_width&#61;"match_parent"
android:layout_height&#61;"match_parent">
android:layout_width&#61;"match_parent"
android:layout_height&#61;"wrap_content"
android:orientation&#61;"vertical">
android:id&#61;"&#64;&#43;id/ll_banner"
android:layout_width&#61;"match_parent"
android:layout_height&#61;"wrap_content"
android:layout_marginLeft&#61;"&#64;dimen/dp12"
android:layout_marginTop&#61;"&#64;dimen/dp12"
android:layout_marginRight&#61;"&#64;dimen/dp12"
app:layout_scrollFlags&#61;"scroll">
android:id&#61;"&#64;&#43;id/convenient_banner"
android:layout_width&#61;"match_parent"
android:layout_height&#61;"&#64;dimen/dp104"
app:canLoop&#61;"true" />

android:id&#61;"&#64;&#43;id/tablayout"
android:layout_width&#61;"match_parent"
app:tabMaxWidth&#61;"&#64;dimen/dp84"
android:layout_height&#61;"&#64;dimen/dp34"
style&#61;"&#64;style/aliwx_column_third_grade_with_click_style"
app:tabPaddingEnd&#61;"0dp"
app:tabPaddingStart&#61;"&#64;dimen/dp0"
android:layout_marginBottom&#61;"&#64;dimen/dp12"
android:layout_marginLeft&#61;"&#64;dimen/dp12"
android:layout_marginRight&#61;"&#64;dimen/dp12"
app:tabIndicatorHeight&#61;"0dp"
android:layout_marginTop&#61;"&#64;dimen/dp12"
android:background&#61;"&#64;drawable/iv_homefragment_label" />


android:id&#61;"&#64;&#43;id/viewpager"
android:layout_width&#61;"match_parent"
android:layout_marginLeft&#61;"&#64;dimen/dp12"
android:layout_marginRight&#61;"&#64;dimen/dp12"
android:layout_height&#61;"match_parent"
app:layout_behavior&#61;"&#64;string/appbar_scrolling_view_behavior" />

布局可见&#xff0c;CoordinatorLayout为滚动部分的整体布局&#xff0c;甚至可看做行为可控制的ScrollView。

AppBarLayout作为悬浮窗口&#xff0c;什么地方要悬浮就在此ViewGroup里面写布局&#xff0c;而需要注意的是标红部分app:layout_scrollFlags&#61;"scroll" 其中值有五种&#xff0c;具体差异可在这篇博客中看到&#xff1a;https://www.jianshu.com/p/7caa5f4f49bd

此处的意思是其ChildView跟随滚动事件移除屏幕外或移进。

app:layout_behavior&#61;"&#64;string/appbar_scrolling_view_behavior"指定了ViewPager的滚动行为

当总体布局写成这样就能基本实现框架了&#xff0c;接下来将各部分关联起来


&#xff08;2&#xff09;ViewPager部分

viewpager这里设计的是使用viewpager&#43;fragment&#43;recyclerview的方式是实现。

首先viewpager与tablayout绑定就很简单的一句话&#xff1a;mTablayout.setupWithViewPager(mViewpager);

这样的话。viewpager与tablayout的行为就实现了绑定&#xff0c;具体内容填充后面会介绍到

接着viewpager的部分&#xff0c;首先是viewpager的适配器&#xff0c;此处使用FragmentPagerAdapter&#xff1a;

public class HomeViewPagerAdapter extends FragmentPagerAdapter
private List mLabelsListBeanList;
private Context mContext;
private List mViewPagerFragments;
FragmentManager fM;
public HomeViewPagerAdapter(Context context,FragmentManager fm, List labelsListBeanList)
super(fm);
fM &#61; fm;
mContext&#61;context;
mLabelsListBeanList&#61;labelsListBeanList;
mViewPagerFragments&#61;new ArrayList<>();

&#64;Override
public Fragment getItem(int position)
ViewPagerFragment fragment &#61; new ViewPagerFragment();
Bundle bundle&#61;new Bundle();
bundle.putParcelable("data",mLabelsListBeanList.get(position));
fragment.setArguments(bundle);
return fragment;

public void notifData( List labelsListBeanList)
mLabelsListBeanList&#61;labelsListBeanList;
notifyDataSetChanged();

&#64;Override
public Object instantiateItem(ViewGroup container, int position)
ViewPagerFragment fragment &#61; (ViewPagerFragment)super.instantiateItem(container,
position);
FragmentTransaction ft &#61;fM.beginTransaction();
String fragmentTag &#61; fragment.getTag();
ft.remove(fragment);
fragment &#61; new ViewPagerFragment();
Bundle bundle&#61;new Bundle();
bundle.putParcelable("data",mLabelsListBeanList.get(position));
fragment.setArguments(bundle);
ft.add(container.getId(), fragment, fragmentTag);
ft.attach(fragment);
ft.commitAllowingStateLoss();
return fragment;

&#64;Override
public int getCount()
return mLabelsListBeanList&#61;&#61;null?0:mLabelsListBeanList.size();

&#64;Override
public int getItemPosition(Object object)
return POSITION_NONE;

此处需要注意的就是两个标红方法的重载&#xff0c;getItem当Viewpager创建新界面的时候启用&#xff0c;instantiateItem是当前界面渲染的时候使用&#xff0c;因为我写的效果里面需要切换城市&#xff0c;要刷新Viewpager的状态与数据&#xff0c;所以需要使用到instantiateItem&#xff0c;没有这个需求的&#xff0c;getItem就能够实现。此处使用的是传参方式将数据传递到new出来的fragment。至于fragment部分就拿到数据&#xff0c;展示到recyclerview里面&#xff0c;这里就不做说明了。


&#xff08;3&#xff09;自定义tablayout

首先说明如果是纯文字的tablayout只需要在viewpager的adapter中加上

  &#64;Override
    public CharSequence getPageTitle(int position)
        return tabStringList.get(position);
   

tagStringList即为标签文字集合

而如果采用自定义tablayout的话就需要在绑定之后进行布局的渲染&#xff1a;

//此处设置tablayout的内容
for (int i &#61; 0; i TabLayout.Tab tabAt &#61; mHomePageChangeFragmentView.getTabLayout().getTabAt(i);
View view&#61; LayoutInflater.from(mContext).inflate(R.layout.item_recycler_home,null);
if (i&#61;&#61;mLabelsListBeanLists.size()-1)
//最后一个不显示箭头
view.findViewById(R.id.iv_cutline).setVisibility(View.GONE);
else
view.findViewById(R.id.iv_cutline).setVisibility(View.VISIBLE);

((TextView)view.findViewById(R.id.tv_selected)).setText(mLabelsListBeanLists.get(i).getName());
((TextView)view.findViewById(R.id.tv_unselect)).setText(mLabelsListBeanLists.get(i).getName());
if (i&#61;&#61;0)
//第一个默认设置被选中
view.findViewById(R.id.llyout_selected).setVisibility(View.VISIBLE);
view.findViewById(R.id.tv_unselect).setVisibility(View.INVISIBLE);
else
//其他设置为不选中状态
view.findViewById(R.id.llyout_selected).setVisibility(View.INVISIBLE);
view.findViewById(R.id.tv_unselect).setVisibility(View.VISIBLE);

tabAt.setCustomView(view);

mHomePageChangeFragmentView.getTabLayout().addOnTabSelectedListener(this);

如代码所示&#xff0c;在tablayout绑定viewpager后&#xff0c;填充tablayout的布局&#xff0c;并处理事件&#xff0c;处理事件采用监听

&#64;Override
public void onTabSelected(TabLayout.Tab tab)
if (tab!&#61;null&&tab.getCustomView()!&#61;null)
tab.getCustomView().findViewById(R.id.llyout_selected).setVisibility(View.VISIBLE);
tab.getCustomView().findViewById(R.id.tv_unselect).setVisibility(View.INVISIBLE);

&#64;Override
public void onTabUnselected(TabLayout.Tab tab)
if (tab!&#61;null&&tab.getCustomView()!&#61;null)
tab.getCustomView().findViewById(R.id.llyout_selected).setVisibility(View.INVISIBLE);
tab.getCustomView().findViewById(R.id.tv_unselect).setVisibility(View.VISIBLE);

&#64;Override
public void onTabReselected(TabLayout.Tab tab)

而此处说一说自己踩的坑&#xff0c;首先tablayout的子布局tabitem宽度&#xff0c;并不是根据你设置的宽度进行渲染的&#xff0c;它会在计算的时候进行重新计算&#xff0c;类似于LinearLayout子布局中加android:layout_weight&#61;""的效果&#xff0c;平分tablayout的宽度&#xff0c;想要自行设置宽度的话&#xff0c;在tablyout中设置属性app:tabMaxWidth&#61;"&#64;dimen/dp84"即可&#xff0c;然后tabitem自带padding&#xff0c;所以发现自己布局不对的话&#xff0c;设置其属性

app:tabPaddingEnd&#61;"0dp"
app:tabPaddingStart&#61;"&#64;dimen/dp0"

而想要设置没有下划线则设置&#xff0c;app:tabIndicatorHeight&#61;"0dp"&#xff0c;此处不再多做赘述&#xff0c;因为属性有点多&#xff0c;具体的根据想要实现的效果填充即可

 

本篇博客到此结束&#xff0c;感谢观看。

如有不对&#xff0c;请指正。

因为此效果是在项目中&#xff0c; 所以不太好传源码&#xff0c;见谅&#xff01;


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
author-avatar
小亲-火星小地球义
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有