在很多地方我们都会用到纵向列表样式的菜单,比如微信首页的我、发现页面,微博的首页的我页面,QQ的动态页面等等等等,大多数的应用中都会存在这样的页面。我们怎样实现这种页面比较好呢?

布局方案
完成这样的页面,常见的布局方案有:
1. 用ScrollView+LinearLayout很容易的暴力布局出来,但是这样得到的布局太固定了,如果条目多一点,加载起来很耗时。
2. 用ListView来实现,这种方案比方案一要好上不少,起码数据多点的时候,加载时不会太耗时。但是分割线和中间空白在要求差异化的时候,不太好绘制,用View的话又觉得大材小用。
3. 用RecyclerView来实现。RecyclerView做纵向布局相比ListView在很多方面也更灵活,无论是动画还是分割线上。
实现效果
三个图片中分割线样式都是比较常见的。
使用起来当然是希望以最简单粗暴的方式去使用,比如:
mMenuView.setCutLineLeftPadding(30); mMenuView.setCutLineRightPadding(30); mMenuView.setGapLineColor(getResources().getColor(R.color.theme_bg)); MenuBean h=new MenuBean(); //或者直接指定rootView h.type=R.layout.head_user; h.menu="美其名曰美"; h.info="天道有常,不为尧存,不为桀亡。"; mMenuView.addMenu(5,h); mMenuView.addGap(30); addMenu(11,R.mipmap.ic1,"菜单一","新年新气象",true); addMenu(12,R.mipmap.ic2,"菜单二","",false); addMenu(13,R.mipmap.ic3,"菜单三","发现更好的自己",false); mMenuView.addGap(30); addMenu(14,R.mipmap.ic4,"菜单四","",true); addMenu(15,R.mipmap.ic5,"菜单五","",true); mMenuView.addGap(30); addMenu(16,R.mipmap.ic6,"菜单六","",true); addMenu(17,R.mipmap.ic7,"菜单七","",false); addMenu(18,R.mipmap.ic8,"菜单八","开心才是最重要的",true);
具体实现
实现这样的效果,如果不考虑分割线的话,那么稍微用过RecyclerView的应该都能显示这样的功能,所以重点还是在分割线上了。
RecyclerView有一个增加分割线的方法addItemDecoration,当然,这个方法并不是只能用来增加分割线。类似微信中通讯录按照ABCD顺序排列,并分组同样可以用这个方法来实现。
直接贴上自定义的分割线的代码,在代码中解释:
class MenuDecoration extends RecyclerView.ItemDecoration{
//onDraw在每次重绘时都会调用,比如滑动RecyclerView
//gap线为从左到右的完整线条,在最开始的item上,最后的item下,或者空白区域的上下
//cut线为两个紧密挨着的两个item之间的线条
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
//当第一个Item可见的时候,给第一个Item顶上绘一条Gap线
//不用完整可见才绘制,考虑设置paddingTop+clipPadding=false的情况
if(mLayout.findFirstVisibleItemPosition()==0){
int bottom=parent.getChildAt(0).getTop();
paint.setColor(gapLineColor);
c.drawLine(parent.getLeft(),bottom-halfLineHeight,parent.getRight(),bottom-halfLineHeight,paint);
}
int count=parent.getChildCount();
int gap;
int end=mData.size()-1;
//所有可见的Item下面画线
for (int i=0;i<count;i++){
final View child = parent.getChildAt(i);
int position=mLayout.getPosition(child);
gap=mGap.get(position);
float startY=child.getBottom()+halfLineHeight;
//View下面不存在gap且不是最好一个Item的时候,绘制Cut线,否则绘制gap线
if(gap==0&&position!=end){
//绘制cut线的左边线条
if(leftPaddingLine!=0){
paint.setColor(foreLineColor);
c.drawLine(parent.getLeft(),startY,parent.getLeft()+leftPaddingLine,startY,paint);
}
//绘制cut线的右边线条
if(rightPaddingLine!=0){
paint.setColor(foreLineColor);
c.drawLine(parent.getRight()-rightPaddingLine,startY,parent.getRight(),startY,paint);
}
//绘制cut线的中间线条
paint.setColor(cutLineColor);
c.drawLine(parent.getLeft()+leftPaddingLine,startY,parent.getRight()-rightPaddingLine,startY,paint);
}else{
paint.setColor(gapLineColor);
//绘制gap上面的一条线
c.drawLine(parent.getLeft(),child.getBottom()+halfLineHeight,parent.getRight(),child.getBottom()+halfLineHeight,paint);
//如果不是最后一个item,绘制gap下面的一条线
if(position<end){
c.drawLine(parent.getLeft(),child.getBottom()+gap+halfLineHeight,parent.getRight(),child.getBottom()+gap+halfLineHeight,paint);
}
}
}
}
//在每个item加载时调用,用来判断设置每个item上下左边的空白区域,设置内容分别设置到outRect中
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
int position=mLayout.getPosition(view);
//如果是第一个Item,则设置上线条高度,否则不设置上线条高度
//为每个item设置下边线条+gap(如果有的话,没有就为0)的高度
//四个参数分别为左边空白区域,上方空白区域,右边空白区域,下方空白区域
outRect.set(0, position != 0 ? 0 : (int)(halfLineHeight * 2+0.5f),0,(int)(halfLineHeight*2+0.5f)+mGap.get(position));
}
}
这样我们就得到了一个用来绘制分割线的类了。在需要插入空白的地方addGap,并传入gap的高度:
public void addGap(int height){
mGap.put(mData.size()-1,height);
}
这样分割线和空白的问题就解决了。其他的就是RecyclerView的简单使用了,为了使用方便,我们对RecyclerView和其Adapter简单封装一下,就能实现用addMenu的方式增加菜单项了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# RecyclerView
# 列表
# 菜单
# Android中RecyclerView实现多级折叠列表效果(二)
# Android中RecyclerView实现多级折叠列表效果(TreeRecyclerView)
# Android单个RecyclerView实现列表嵌套的效果
# Android RecyclerView实现数据列表展示效果
# Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新
# 使用RecyclerView实现水平列表
# Android列表RecyclerView排列布局
# RecyclerView优雅实现复杂列表布局
# 分割线
# 第一个
# 来实现
# 加载
# 不为
# 中分
# 首页
# 一条线
# 都是
# 多点
# 是在
# 大材小用
# 就能
# 才是
# 上了
# 都能
# 最重要
# 可以用
# 其他的
# 很容易
相关文章:
如何在IIS中配置站点IP、端口及主机头?
平台云上自助建站如何快速打造专业网站?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
制作公司内部网站有哪些,内网如何建网站?
建站主机功能解析:服务器选择与快速搭建指南
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
淘宝制作网站有哪些,淘宝网官网主页?
盘锦网站制作公司,盘锦大洼有多少5G网站?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
宝塔建站助手安装配置与建站模板使用全流程解析
建站三合一如何选?哪家性价比更高?
如何快速上传建站程序避免常见错误?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
如何快速配置高效服务器建站软件?
网站制作壁纸教程视频,电脑壁纸网站?
c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
建站主机空间推荐 高性价比配置与快速部署方案解析
常州企业建站如何选择最佳模板?
如何快速重置建站主机并恢复默认配置?
建站OpenVZ教程与优化策略:配置指南与性能提升
网站制作说明怎么写,简述网页设计的流程并说明原因?
再谈Python中的字符串与字符编码(推荐)
建站主机服务器选购指南:轻量应用与VPS配置解析
建站VPS选购需注意哪些关键参数?
实惠建站价格推荐:2025年高性价比自助建站套餐解析
如何通过VPS建站无需域名直接访问?
如何通过免费商城建站系统源码自定义网站主题与功能?
装修招标网站设计制作流程,装修招标流程?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
建站之星在线客服如何快速接入解答?
c# 服务器GC和工作站GC的区别和设置
建站主机助手选型指南:2025年热门推荐与高效部署技巧
如何选择网络建站服务器?高效建站必看指南
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
python的本地网站制作,如何创建本地站点?
微信h5制作网站有哪些,免费微信H5页面制作工具?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
如何在搬瓦工VPS快速搭建网站?
太平洋网站制作公司,网络用语太平洋是什么意思?
海南网站制作公司有哪些,海口网是哪家的?
非常酷的网站设计制作软件,酷培ai教育官方网站?
如何在西部数码注册域名并快速搭建网站?
如何在云服务器上快速搭建个人网站?
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站中国官网:模板定制+SEO优化+建站流程一站式指南
如何快速完成中国万网建站详细流程?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。