继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Android零基础入门第65节:RecyclerView分割线开发技巧

哈士奇WWW
关注TA
已关注
手记 503
粉丝 71
获赞 400

    在上一期通过简单学习,已经领略到了RecyclerView的灵活性,当然都是一些最基础的用法,那么本期一起来学习RecyclerView的分割线使用。

    相信有的比较细心的同学已经发现了,使用RecyclerView实现的List列表和ListView实现的列表有一些细微差距,item之间没有分割线,导致item之间相隔不明显,但在实际开发中有又往往需要。

    由于RecyclerView并没有支持divider这样的属性,需要我们自己想办法来完成。主要有两种实现方式,接下来分别对其进行学习。

                                        

一、背景设置显示间隔 

    先给RecyclerView添加黑色背景,然后再给每个item添加白色背景并设置间隔1dp,这样自然就用背景空隙当做分割线了。

    在上一期的基础上进行简单修改即可,修改后的recyclerview_layout.xml文件代码如下:

[代码]xml代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

              android:orientation="vertical"

              android:layout_width="match_parent"

              android:layout_height="match_parent">

 

    <android.support.v7.widget.RecyclerView

        android:id="@+id/recyclerview"

        android:background="#5000"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"/>

</LinearLayout>

    修改后的recyclerview_item.xml文件代码如下:

[代码]xml代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:background="#fff"

                android:layout_marginBottom="1dp"

                android:padding="6dp" >

 

    <ImageView

        android:id="@+id/icon_img"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:layout_centerVertical="true"

        android:layout_marginRight="6dp"

        android:contentDescription="null"

        android:src="@mipmap/ic_launcher" />

 

    <TextView

        android:id="@+id/title_tv"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_toRightOf="@id/icon_img"

        android:layout_alignParentTop="true"

        android:layout_marginTop="5dp"

        android:gravity="center_vertical"

        android:text="Title"

        android:textSize="16sp" />

 

    <TextView

        android:id="@+id/content_tv"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_toRightOf="@id/icon_img"

        android:layout_alignParentRight="true"

        android:layout_below="@id/title_tv"

        android:layout_marginTop="5dp"

        android:text="content"

        android:textSize="12sp" />

 

</RelativeLayout>

    其他地方的代码不变,重新运行程序,可以看到下图所示的分割线。

二、自定义分割线

    上面第一种实现方式非常简单,但有时候还是不足以完成实际需求,这就需要用到自定义分割线了。

    还记得上期里面提到的ItemDecoration类的作用了吗?RecyclerView类也提供了一个addItemDecoration方法,我们可以通过该方法添加分割线。

    首先我们自定义一个drawable文件recyclerview_item_divider,具体内容后续会进行学习的,这里不做过多介绍,代码如下:

[代码]xml代码:

?

01

02

03

04

05

06

07

08

09

10

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android"

       android:shape="rectangle">

    <gradient

        android:centerColor="#ff00ff00"

        android:endColor="#ff0000ff"

        android:startColor="#ffff0000"

        android:type="linear" />

    <size android:height="1dp"/>

</shape>

    由于RecyclerView.ItemDecoration为抽象类,需要自定义一个实现类,该类很好的实现了为RecyclerView添加分割线。新建RecyclerViewItemDivider类,具体代码如下:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

package com.jinyu.cqkxzsxy.android.advancedviewsample.view;

 

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Rect;

import android.graphics.drawable.Drawable;

import android.support.v7.widget.RecyclerView;

import android.view.View;

 

/**

 * @创建者 鑫鱻

 * @描述 Android零基础入门到精通系列教程

 * 首发微信公众号分享达人秀(ShareExpert)

 */

public class RecyclerViewItemDivider   extends RecyclerView.ItemDecoration   {

    private Drawable mDrawable;

 

    public RecyclerViewItemDivider(Context context, int resId) {

        mDrawable   = context.getResources().getDrawable(resId);

    }

 

    @Override

    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {

        int left = parent.getPaddingLeft();

        int right = parent.getWidth() -   parent.getPaddingRight();

        int childCount = parent.getChildCount();

        for (int i = 0; i < childCount; i++) {

            View   child = parent.getChildAt(i);

            RecyclerView.LayoutParams   params = (RecyclerView.LayoutParams) child.getLayoutParams();

            int top = child.getBottom() +   params.bottomMargin;

            int bottom = top +   mDrawable.getIntrinsicHeight();

            mDrawable.setBounds(left,   top, right, bottom);

            mDrawable.draw(c);

        }

    }

 

    @Override

    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,

                               RecyclerView.State   state) {

        outRect.set(0,   0, 0, mDrawable.getIntrinsicWidth());

    }

}

    然后在将自定义的分割线添加到RecyclerView中,局部代码如下:

[代码]java代码:

?

1

2

3

4

5

6

7

8

9

// 设置管理器

LinearLayoutManager layoutManager = new LinearLayoutManager(this);

mRecyclerView.setLayoutManager(layoutManager);

// 自定义分割线

RecyclerView.ItemDecoration   itemDecoration = new RecyclerViewItemDivider(this,

        R.drawable.recyclerview_item_divider);

mRecyclerView.addItemDecoration(itemDecoration);

// 如果可以确定每个item的高度是固定的,设置这个选项可以提高性能

mRecyclerView.setHasFixedSize(true);

    其余代码不变,重新运行程序,可以看到效果

    可以看到,自定义分割线的自由度和灵活性较大,也更加炫丽,完全可以根据实际需要来定制。

    上面学习的自定义分割线只适合纵向列表,由于横向列表和网格布局每一行都有多个子视图,需要重新定义一个ItemDecoration类,这里就不作过多介绍了。

    今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!

原文链接:http://www.apkbus.com/blog-205190-72750.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP