recyclerview更加优化的复用机制和方便实现ui效果,几乎替代listview和gridview的使用。但是分割线的实现,需要自己继承itemdecoration来绘制。
效果图
item的布局文件
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical" android:layout_margintop="25dp" android:layout_marginleft="15dp" android:layout_marginright="15dp"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="餐饮" android:id="@+id/txt_title" android:textsize="16sp" android:textstyle="bold" android:textcolor="#555555"/> <imageview android:layout_width="36dp" android:layout_height="36dp" android:id="@+id/img_title" android:src="@mipmap/luggage_blue"/> </linearlayout> <linearlayout android:layout_width="match_parent" android:layout_height="20dp" android:orientation="vertical" android:layout_marginbottom="25dp" android:layout_marginleft="15dp" android:layout_marginright="15dp"> <textview android:layout_width="match_parent" android:layout_height="match_parent" android:text="提供航空 餐饮美食" android:id="@+id/txt_info" android:textsize="14sp" android:textcolor="#999999"/> </linearlayout> </linearlayout>
activity_main.xml布局文件
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f1f1f1" tools:context=".mainactivity"> <textview android:layout_width="match_parent" android:layout_height="50dp" android:textcolor="#ffffff" android:textsize="18sp" android:gravity="center" android:text="recyclerview实现九宫格" android:background="#30b8e3"/> <scrollview android:layout_width="match_parent" android:layout_height="match_parent"> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <linearlayout android:layout_width="match_parent" android:layout_height="50dp" android:gravity="center_vertical" android:layout_marginleft="15dp" android:layout_marginright="15dp" android:orientation="horizontal"> <imageview android:layout_width="20dp" android:layout_height="20dp" android:src="@mipmap/air_gray" android:layout_marginright="8dp"/> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:text="航行助手" android:textstyle="bold" android:textsize="18sp"/> </linearlayout> <android.support.v7.widget.recyclerview android:id="@+id/main_recycleview" android:divider="#00000000" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/shape_bg" android:layout_marginleft="15dp" android:layout_marginright="15dp" android:layout_marginbottom="15dp"> </android.support.v7.widget.recyclerview> </linearlayout> </scrollview> </linearlayout>
mainactivity.java代码
package com.davis.recyclerviewdemo; import android.os.bundle; import android.support.v7.app.appcompatactivity; import android.support.v7.widget.gridlayoutmanager; import android.support.v7.widget.recyclerview; import com.davis.recyclerviewdemo.adapter.commondecoration; import com.davis.recyclerviewdemo.adapter.recyclerviewadapter; import com.davis.recyclerviewdemo.bean.menubean; import java.util.arraylist; import java.util.list; public class mainactivity extends appcompatactivity { private recyclerview recyclerview; private recyclerviewadapter adapter; private list<menubean> listdatas = new arraylist<menubean>(); @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); init(); } private void init(){ recyclerview = (recyclerview)findviewbyid(r.id.main_recycleview); loadmenudata(); recyclerview.setlayoutmanager(new gridlayoutmanager(this, 2)); recyclerview.additemdecoration(new commondecoration(this)); adapter = new recyclerviewadapter(this, listdatas); recyclerview.setadapter(adapter); } private void loadmenudata(){ listdatas.add(new menubean("安检", "快速安检", r.mipmap.check_blue)); listdatas.add(new menubean("行李", "提醒行李动态", r.mipmap.luggage_blue)); listdatas.add(new menubean("餐饮", "提供航空 餐饮美食", r.mipmap.food_blue)); listdatas.add(new menubean("vip休息", "机场休息室", r.mipmap.vip_blue)); listdatas.add(new menubean("机舱服务", "机舱上网 游戏娱乐", r.mipmap.service_blue)); listdatas.add(new menubean("更多", "更多信息", r.mipmap.more_blue)); } }
其中gridlayoutmanager用来设置显示列数,commondecoration用来绘制分隔线。
commondecoration.java代码
package com.davis.recyclerviewdemo.adapter; import android.content.context; import android.content.res.typedarray; import android.graphics.canvas; import android.graphics.rect; import android.graphics.drawable.drawable; import android.support.v7.widget.gridlayoutmanager; import android.support.v7.widget.recyclerview; import android.support.v7.widget.staggeredgridlayoutmanager; import android.view.view; /** * created by administrator on 2019/4/14. */ public class commondecoration extends recyclerview.itemdecoration { private static final int[] attrs = new int[]{android.r.attr.listdivider}; private drawable mdivider; public commondecoration(context context) { final typedarray a = context.obtainstyledattributes(attrs); mdivider = a.getdrawable(0); a.recycle(); } @override public void ondraw(canvas c, recyclerview parent, recyclerview.state state) { drawhorizontal(c, parent); drawvertical(c, parent); } private int getspancount(recyclerview parent) { // 列数 int spancount = -1; recyclerview.layoutmanager layoutmanager = parent.getlayoutmanager(); if (layoutmanager instanceof gridlayoutmanager) { spancount = ((gridlayoutmanager) layoutmanager).getspancount(); } else if (layoutmanager instanceof staggeredgridlayoutmanager) { spancount = ((staggeredgridlayoutmanager) layoutmanager) .getspancount(); } return spancount; } public void drawhorizontal(canvas c, recyclerview parent) { int childcount = parent.getchildcount(); for (int i = 0; i < childcount; i++) { final view child = parent.getchildat(i); final recyclerview.layoutparams params = (recyclerview.layoutparams) child .getlayoutparams(); final int left = child.getleft() - params.leftmargin; final int right = child.getright() + params.rightmargin + mdivider.getintrinsicwidth(); final int top = child.getbottom() + params.bottommargin; final int bottom = top + mdivider.getintrinsicheight(); mdivider.setbounds(left, top, right, bottom); mdivider.draw(c); } } public void drawvertical(canvas c, recyclerview parent) { final int childcount = parent.getchildcount(); for (int i = 0; i < childcount; i++) { final view child = parent.getchildat(i); final recyclerview.layoutparams params = (recyclerview.layoutparams) child .getlayoutparams(); final int top = child.gettop() - params.topmargin; final int bottom = child.getbottom() + params.bottommargin; final int left = child.getright() + params.rightmargin; final int right = left + mdivider.getintrinsicwidth(); mdivider.setbounds(left, top, right, bottom); mdivider.draw(c); } } private boolean islastcolum(recyclerview parent, int pos, int spancount, int childcount) { recyclerview.layoutmanager layoutmanager = parent.getlayoutmanager(); if (layoutmanager instanceof gridlayoutmanager) { // 如果是最后一列,则不需要绘制右边 if ((pos + 1) % spancount == 0) { return true; } } else if (layoutmanager instanceof staggeredgridlayoutmanager) { int orientation = ((staggeredgridlayoutmanager) layoutmanager) .getorientation(); if (orientation == staggeredgridlayoutmanager.vertical) { // 如果是最后一列,则不需要绘制右边 if ((pos + 1) % spancount == 0) { return true; } } else { childcount = childcount - childcount % spancount; if (pos >= childcount) {// 如果是最后一列,则不需要绘制右边 return true; } } } return false; } private boolean islastraw(recyclerview parent, int pos, int spancount, int childcount) { recyclerview.layoutmanager layoutmanager = parent.getlayoutmanager(); if (layoutmanager instanceof gridlayoutmanager) { int last = childcount % spancount; if (last == 0) { last = spancount; } childcount = childcount - last; if (pos >= childcount) {// 如果是最后一行,则不需要绘制底部 return true; } } else if (layoutmanager instanceof staggeredgridlayoutmanager) { int orientation = ((staggeredgridlayoutmanager) layoutmanager) .getorientation(); // staggeredgridlayoutmanager 且纵向滚动 if (orientation == staggeredgridlayoutmanager.vertical) { int last = childcount % spancount; if (last == 0) { last = spancount; } childcount = childcount - last; // 如果是最后一行,则不需要绘制底部 if (pos >= childcount) { return true; } } else {// staggeredgridlayoutmanager 且横向滚动 // 如果是最后一行,则不需要绘制底部 if ((pos + 1) % spancount == 0) { return true; } } } return false; } @override public void getitemoffsets(rect outrect, int itemposition, recyclerview parent) { int spancount = getspancount(parent); int childcount = parent.getadapter().getitemcount(); if (islastcolum(parent, itemposition, spancount, childcount)) {// 如果是最后一列,则不需要绘制右边 if (itemposition == (childcount - 1)) { outrect.set(0, 0, 0, 0); } else { outrect.set(0, 0, 0, mdivider.getintrinsicheight()); } } else if (islastraw(parent, itemposition, spancount, childcount)) {// 如果是最后一行,则不需要绘制底部 outrect.set(0, 0, mdivider.getintrinsicwidth(), 0); } else { outrect.set(0, 0, mdivider.getintrinsicwidth(), mdivider.getintrinsicheight()); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。