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());
        }
    }
}

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