Android零基礎入門第65節:RecyclerView分割線開發技巧

NO IMAGE

   在上一期通過簡單學習,已經領略到了RecyclerView的靈活性,當然都是一些最基礎的用法,那麼本期一起來學習RecyclerView的分割線使用。

    相信有的比較細心的同學已經發現了,使用RecyclerView實現的List列表和ListView實現的列表有一些細微差距,item之間沒有分割線,導致item之間相隔不明顯,但在實際開發中有又往往需要。

    由於RecyclerView並沒有支援divider這樣的屬性,需要我們自己想辦法來完成。主要有兩種實現方式,接下來分別對其進行學習。

 

 

一、背景設定顯示間隔 

 

    先給RecyclerView新增黑色背景,然後再給每個item新增白色背景並設定間隔1dp,這樣自然就用背景空隙當做分割線了。

    在上一期的基礎上進行簡單修改即可,修改後的recyclerview_layout.xml檔案程式碼如下:

<?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檔案程式碼如下:

<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 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類,具體程式碼如下:

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中,區域性程式碼如下:

        // 設定管理器
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零基礎入門技術討論微信群,共同成長!

   此文章版權為微信公眾號分享達人秀(ShareExpert)——鑫鱻所有,若需轉載請聯絡作者授權,特此宣告!

 

往期總結分享:

Android零基礎入門第1節:Android的前世今生

Android零基礎入門第2節:Android 系統架構和應用元件那些事

Android零基礎入門第3節:帶你一起來聊一聊Android開發環境

Android零基礎入門第4節:正確安裝和配置JDK, 高富帥養成第一招

Android零基礎入門第5節:善用ADT Bundle, 輕鬆邂逅女神

Android零基礎入門第6節:配置優化SDK Manager, 正式約會女神

Android零基礎入門第7節:搞定Android模擬器,開啟甜蜜之旅

Android零基礎入門第8節:HelloWorld,我的第一趟旅程出發點

Android零基礎入門第9節:Android應用實戰,不懂程式碼也可以開發

Android零基礎入門第10節:開發IDE大升級,終於迎來了Android Studio

Android零基礎入門第11節:簡單幾步帶你飛,執行Android Studio工程

Android零基礎入門第12節:熟悉Android Studio介面,開始裝逼賣萌

Android零基礎入門第13節:Android Studio個性化配置,打造開發利器

Android零基礎入門第14節:使用高速Genymotion,跨入火箭時代

Android零基礎入門第15節:掌握Android Studio專案結構,揚帆起航

Android零基礎入門第16節:Android使用者介面開發概述

Android零基礎入門第17節:文字框TextView

Android零基礎入門第18節:輸入框EditText

Android零基礎入門第19節:按鈕Button

Android零基礎入門第20節:核取方塊CheckBox和單選按鈕RadioButton

Android零基礎入門第21節:開關元件ToggleButton和Switch

Android零基礎入門第22節:影象檢視ImageView

Android零基礎入門第23節:影象按鈕ImageButton和縮放按鈕ZoomButton

Android零基礎入門第24節:自定義View簡單使用,打造屬於你的控制元件

Android零基礎入門第25節:簡單且最常用的LinearLayout線性佈局

Android零基礎入門第26節:兩種對齊方式,layout_gravity和gravity大不同

Android零基礎入門第27節:正確使用padding和margin

Android零基礎入門第28節:輕鬆掌握RelativeLayout相對佈局

Android零基礎入門第29節:善用TableLayout表格佈局

Android零基礎入門第30節:兩分鐘掌握FrameLayout幀佈局

Android零基礎入門第31節:少用的AbsoluteLayout絕對佈局

Android零基礎入門第32節:新推出的GridLayout網格佈局

Android零基礎入門第33節:Android事件處理概述

Android零基礎入門第34節:Android中基於監聽的事件處理

Android零基礎入門第35節:Android中基於回撥的事件處理

Android零基礎入門第36節:Android系統事件的處理

Android零基礎入門第37節:初識ListView

Android零基礎入門第38節:初識Adapter

Android零基礎入門第39節:ListActivity和自定義列表項

Android零基礎入門第40節:自定義ArrayAdapter

Android零基礎入門第41節:使用SimpleAdapter

Android零基礎入門第42節:自定義BaseAdapter

Android零基礎入門第43節:ListView優化和列表首尾使用

Android零基礎入門第44節:ListView資料動態更新

Android零基礎入門第45節:網格檢視GridView

Android零基礎入門第46節:列表選項框Spinner

Android零基礎入門第47節:自動完成文字框AutoCompleteTextView

Android零基礎入門第48節:可摺疊列表ExpandableListView

Android零基礎入門第49節:AdapterViewFlipper圖片輪播

Android零基礎入門第50節:StackView卡片堆疊

Android零基礎入門第51節:進度條ProgressBar

Android零基礎入門第52節:自定義ProgressBar炫酷進度條

Android零基礎入門第53節:拖動條SeekBar和星級評分條RatingBar

Android零基礎入門第54節:檢視切換元件ViewSwitcher

Android零基礎入門第55節:ImageSwitcher和TextSwitcher

Android零基礎入門第56節:翻轉檢視ViewFlipper

Android零基礎入門第57節:DatePicker和TimePicker選擇器

Android零基礎入門第58節:數值選擇器NumberPicker

Android零基礎入門第59節:常用三大Clock時鐘元件

Android零基礎入門第60節:日曆檢視CalendarView和定時器Chronometer

Android零基礎入門第61節:滾動檢視ScrollView

Android零基礎入門第62節:搜尋框元件SearchView

Android零基礎入門第63節:值得借鑑學習的選項卡TabHost

Android零基礎入門第64節:揭開RecyclerView廬山真面目