RecyclerView实现常见的列表菜单

在很多地方我们都会用到纵向列表样式的菜单,比如微信首页的我、发现页面,微博的首页的我页面,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的方式增加菜单项了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • javascript实现dom动态创建省市纵向列表菜单的方法

    本文实例讲述了javascript实现dom动态创建省市纵向列表菜单的方法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtm

  • 如何在读取Excel文件时创建列表的下拉菜单?

    < select name="XlSheet" >< %vOptions = "< option >< /option >"Do While Not oSchemaRs.EOF  If oSchemaRs("TABLE_TYPE") = "SYSTEM TABLE" Then      vOptions = vOptions & "< option >&q

  • jQuery三级下拉列表导航菜单代码分享

    本文实例讲述了jQuery三级下拉列表导航菜单.分享给大家供大家参考.具体如下: jQuery三级下拉列表导航菜单基于jquery-1.8.3.min.js,可无限极分类,可智能判断是否有下级菜单,鼠标经过上次菜单显示下级菜单. 运行效果图:             -------------------查看效果------------------- 小提示:浏览器中如果不能正常运行,可以尝试切换浏览模式. 为大家分享的jQuery三级下拉列表导航菜单代码如下 <head> <meta

  • javascript下拉列表菜单的实现方法

    之前写过这个<javascript下拉列表中显示树形菜单的实现方法>菜单的体现,但是在写了之后就发现了,不太适合,高度要精准控制,并且还不是很好看.现在采用table来封装,我们知道table的每一行写满了之后,下一行会自动加,这个比之前我们自己制定高度好很多. 1.点击之后都可以并存的情况(只需函数写法不一样就可) dispaly也是自己设置的,通过父节点来操作子节点,显示与否: /* function open1(node){ //通过父节点来操作兄弟节点 当点击之后出现之后,直接就能打开

  • javascript下拉列表中显示树形菜单的实现方法

    很简单的一个使用:点击菜单,能够显示下面的或者不显示. 1.主要目的:展现的是的一个菜单项,然后点击一下,隐藏,点一下,弹出下面的内容 用到的是 overflow:hidden    和  overflow="visible"这两个属性 在点击的function中,设置属性应该 node.style.overflow="visible";当然设置tr的高度也是很重要的,要恰好让其他的选项隐蔽 2.采用同样的技术,多加几个,但是就是传参数比较麻烦,采用this传参很常

  • 基于jQuery的简单的列表导航菜单

    下面是我做的一个简单的导航菜单,因为是新手,难免有什么不对的地方,希望大家拍砖! 好了 开始进入正题吧: 1.首先定义CSS样式表: 复制代码 代码如下: <style type="text/css"> body{font-size:13px} ul,li{list-style-type:none;padding:0px;margin:0px} .menu{width:190px;border:solid 1px #E5D1A1;background-color:#FFFD

  • jQuery实现简单的列表式导航菜单效果代码

    本文实例讲述了jQuery实现简单的列表式导航菜单效果代码.分享给大家供大家参考.具体如下: 这里使用jQuery实现简单的列表式导航菜单,是根据网上的一个教程,边看边写的,经过了修正,拷贝代码即可使用.主要实现包括三个部分,一是CSS.二是引入jQuery.三是编写JS代码进行jQuery控件. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-simple-list-style-nav-menu-codes/ 具体代码如下: <h

  • jquery+css+ul模拟列表菜单具体实现思路

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&qu

  • js实现带有介绍的Select列表菜单实例

    本文实例讲述了js实现带有介绍的Select列表菜单.分享给大家供大家参考.具体如下: 带有介绍的Select列表菜单特效代码,并不是导航菜单,这是表单中常用的下拉列表菜单,里面定义的菜单名称和链接都可以自己修改,不同的是添加了一个说明功能,鼠标点击列表中内容的时候,会浮动出本条内容的介绍,另外文本框内的内容也会跟着改变. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-info-select-menu-codes/ 具体代码如下: <ht

  • javascript实现在下拉列表中显示多级树形菜单的方法

    本文实例讲述了javascript实现在下拉列表中显示多级树形菜单的方法.分享给大家供大家参考.具体如下: 这里演示在下拉列表框中显示分级的菜单,在很多网站都可以看到的效果,很实用,下拉列表框中的选项是利用JS控制输出,如果你有更好的办法不用JS来显示,那最好了,因为像这种菜单用JS来实现,多多少少有点麻烦. 运行效果截图如下: 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "

随机推荐