当前位置: 首页 > 科技观察

Android最流行的吸顶效果的实现(下)_0

时间:2023-03-13 17:30:53 科技观察

继续上面的第一步:首先,我们来写一个类,作为一个标记来放置字符串publicclassNameBean{Stringname;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}第二步:自自定义定义sectionDecoration类recyClerview的itemDecorationPublicCliCClassSectionDecorationExtendExtendSrecyClerview.ItemDecoration{privateStaticFinalFinalStringTag=“SectionDecoration”;publicSectionDecoration(ListdataList,Contextcontext,DecorationCallbackdecorationCallback){Resourcesres=context.getResources();this.dataList=dataList;this.callback=decorationCallback;//设置悬浮条的画笔---paintpaint=newPaint();paint.setColor(res.getColor(R.color.colorGray));//设置浮条中文字的画笔textPaint=newTextPaint();textPaint.setAntiAlias(true);textPaint.setTextSize(DensityUtil.dip2px(context,14));textPaint.setColor(颜色.DKGRAY);textPaint.setTextAlign(Paint.Align.LEFT);fontMetrics=newPaint.FontMetrics();//确定浮动条的高度等topGap=res.getDimensionPixelSize(R.dimen.sectioned_top);//确定文字显示位置等alignBottom=res.getDimensionPixelSize(R.dimen.sectioned_alignBottom);}@OverridepublicvoidgetItemOffsets(RectoutRect,Viewview,RecyclerViewparent,RecyclerView.Statestate){super.getItemOffsets(outRect,view,parent,state);intpos=parent.getChildAdapterPosition(view);Log.i(TAG,"getItemOffsets:"+pos);StringgroupId=callback.getGroupId(pos);if(groupId.equals("-1"))return;//只显示同组的第一个暂停柱if(pos==0||isFirstInGroup(pos)){outRect.top=topGap;if(dataList.get(pos).getName()==""){outRect.top=0;}}else{outRect.top=0;}}@OverridepublicvoidonDraw(Canvasc,RecyclerViewparent,RecyclerView.Statestate){super.onDraw(c,parent,state);intleft=parent.getPaddingLeft();intright=parent.getWidth()-parent。getPaddingRight();intchildCount=parent.getChildCount();for(inti=0;i向左移动)//textY-alignBottom决定文字向右偏移多少(减-->向上移动)c.drawText(textLine,left+2*alignBottom,textY-alignBottom,textPaint);}}/***判断是否是group中的***位置**@parampos*@return*/privatebooleanisFirstInGroup(intpos){if(pos==0){returntrue;}else{//因为是根据字符串内容是否相同来判断是否与组一致,所以如果这里的tagid是String类型//如果你只是做一个联系人列表,浮动框只显示一个字母,那么tagid可以直接int类型StringprevGroupId=callback.getGroupId(pos-1);StringgroupId=callback.getGroupId(pos);//判断前一个字符串是否与当前字符串相同if(prevGroupId.equals(groupId)){returnfalse;}else{returntrue;}}}//定义借口方便外部调用interfaceDecorationCallback{StringgetGroupId(intposition);StringgetGroupFirstLine(intposition);}}第三步:在列表集合中,首先将作为每一项“标记”的字符串添加到setPullAction(comingslist);privatevoidsetPullAction(Listcomingslist){dataList=newArrayList<>();for(inti=0;i