最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RecyclerView設(shè)置間距和添加分割線的方法

 更新時間:2022年09月05日 15:19:02   作者:Mondarzy  
在使用RecyclerView布局,經(jīng)常需要調(diào)整間距和添加分割線以達(dá)到更美觀效果,這篇文章主要介紹了RecyclerView設(shè)置間距和添加分割線的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

使用RecyclerView布局,經(jīng)常需要調(diào)整間距和添加分割線以達(dá)到更美觀的效果,雖然一直接觸和使用,但卻從來沒有認(rèn)真研究過,經(jīng)常忘記如何使用,現(xiàn)在就來好好研究一番

先放上一個沒有分割線的效果圖

添加默認(rèn)的分割線

使用RecyclerView.addItemDecoration(ItemDecoration decor)方法,添加默認(rèn)的分割線
最簡單的方式就是,添加一個簡單的DividerItemDecoration類:

//添加默認(rèn)的分割線
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

得到的效果圖

另外,可以使用DividerItemDecoration.setDrawble()傳入一個Drawable對象來定義我們想要的效果
繪制一個高度為2dp,顏色為綠色的矩形并將它傳入

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

? ? <solid android:color="#00ff00"/>

? ? <size android:height="2dp" />

</shape>
//添加默認(rèn)分割線
DividerItemDecoration decoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
decoration.setDrawable(getResources().getDrawable(R.drawable.divider_green));
recyclerView.addItemDecoration(decoration);

得到的效果圖

然后,我發(fā)現(xiàn)RecyclerView添加分割線還有一個重載方法:

RecyclerView.addItemDecoration(ItemDecoration decor, int index)

想也沒想,還以為是在指定的位置添加分割線,隨便打了個數(shù)字測試,結(jié)果程序閃退了
翻開源碼一看,原來內(nèi)部用了一個數(shù)組存儲添加進(jìn)來的ItemDecoration,怪不得方法名是addItemDecoration()而不是setItemDecoration(),也就是說RecyclerView可以添加多個ItemDecoration,那么就來試試吧:
繪制了三個矩形,顏色分別為綠色、紅色和藍(lán)色,高度分別為4dp、8dp和12dp,將它們都傳入

//添加默認(rèn)分割線
DividerItemDecoration decoration1 = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
decoration1.setDrawable(getResources().getDrawable(R.drawable.divider_green));
DividerItemDecoration decoration2 = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
decoration2.setDrawable(getResources().getDrawable(R.drawable.divider_red));
DividerItemDecoration decoration3 = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
decoration3.setDrawable(getResources().getDrawable(R.drawable.divider_blue));
recyclerView.addItemDecoration(decoration1);
recyclerView.addItemDecoration(decoration2);
recyclerView.addItemDecoration(decoration3);

效果圖:

換個順序傳入

recyclerView.addItemDecoration(decoration3);
recyclerView.addItemDecoration(decoration2);
recyclerView.addItemDecoration(decoration1);

效果圖:

很顯然,繪制順序是以內(nèi)部數(shù)組中的存儲順序?yàn)榛鶞?zhǔn)的,并且間距是由所有傳入的ItemDecoration的高度或?qū)挾裙餐嬎愕玫降模ㄋ詴霈F(xiàn)除了三種顏色外的灰色分割線)

添加自定義分割線

默認(rèn)的分割線效果不好,想要自定義分割線該怎么做?
很簡單,我們只需要自定義一個類去繼承ItemDecoration類,并重寫相關(guān)的方法就可以了。添加默認(rèn)分割線時使用的DividerItemDecoration也是如此。
編寫一個MyDecoration類,繼承RecyclerView.ItemDecoration類,Ctrl+O,發(fā)現(xiàn)除去已棄用的方法和構(gòu)造方法,ItemDecoration類主要有三個方法:

public void onDraw(Canvas c, RecyclerView parent, State state)
public void onDrawOver(Canvas c, RecyclerView parent, State state)
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state)

大概描述一下幾個方法的作用:

  • getItemOffsets(),獲取Item的偏移量,調(diào)整參數(shù)中outRect的相關(guān)值,可以實(shí)現(xiàn)類似padding的效果。
  • onDraw(),用這種方法繪制的任何內(nèi)容都將在繪制項(xiàng)目視圖之前繪制,繪圖的內(nèi)容將出現(xiàn)在視圖下方。
  • onDrawOver(),用這種方法繪制的任何內(nèi)容都將在繪制項(xiàng)目視圖之后繪制,繪圖的內(nèi)容會出現(xiàn)在視圖上方。

百聞不如一見,直接看實(shí)際效果

getItemOffsets()方法:

//添加自定義分割線
class MyDecoration extends RecyclerView.ItemDecoration {

?? ?@Override
?? ?public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
?? ??? ?super.getItemOffsets(outRect, view, parent, state);
?? ??? ?//設(shè)置間距
?? ??? ?outRect.bottom = 10;
?? ?}
}
//添加裝飾
recyclerView.addItemDecoration(new MyDecoration());

這里僅設(shè)置了底部間距,實(shí)現(xiàn)的效果類似之前使用的DividerItemDecoration

再給每個方向上都設(shè)置間距,看看效果

//添加自定義分割線
class MyDecoration extends RecyclerView.ItemDecoration {

?? ?@Override
?? ?public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
?? ??? ?super.getItemOffsets(outRect, view, parent, state);
?? ??? ?//設(shè)置間距
?? ??? ?outRect.left = 30;
? ? ? ? outRect.right = 50;
? ? ? ? outRect.top = 15;
? ? ? ? outRect.bottom = 10;
?? ?}
}
//添加裝飾
recyclerView.addItemDecoration(new MyDecoration());

可以看到,實(shí)現(xiàn)了類似padding的效果

onDraw()方法:

//添加自定義分割線
class MyDecoration extends RecyclerView.ItemDecoration {

?? ?@Override
?? ?public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
?? ??? ?super.getItemOffsets(outRect, view, parent, state);
?? ??? ?//設(shè)置間距
? ? ? ? outRect.bottom = 10;
? ? }
? ??
?? ?@Override
?? ?public void onDraw(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
? ? ?? ?super.onDraw(c, parent, state);
? ? ? ? Paint paint = new Paint();
? ? ? ? paint.setColor(Color.BLUE);
?? ??? ?//獲取item的數(shù)量
? ? ? ? int count = parent.getChildCount();
? ? ? ? //設(shè)置要繪制的矩形的left、right、top、bottom值
? ? ? ? int left = parent.getPaddingLeft();
? ? ? ? int right = parent.getWidth() - parent.getPaddingRight();
? ? ? ? for (int i = 0; i < count; i++){
? ? ? ? ?? ?//獲取對應(yīng)的item
?? ? ? ? ? ?View view = parent.getChildAt(i);
?? ? ? ? ? ?float top = view.getBottom();
?? ? ? ? ? ?float bottom = view.getBottom() + 10;
?? ? ? ? ? ?//繪制矩形
?? ? ? ? ? ?c.drawRect(left,top,right,bottom,paint);
? ? ?? ?}
?? ?}
}
recyclerView.addItemDecoration(new MyDecoration());

這里仍僅設(shè)置底部間距,并在onDraw()方法中實(shí)例化一個paint對象,設(shè)置顏色為藍(lán)色,用于最終的繪制。之后獲取item的數(shù)量,通過一個循環(huán)來繪制每一個item下方的分割線(當(dāng)然也可以通過某些條件判斷,以達(dá)到只繪制部分分割線的效果),這個分割線的頂部恰好是item的底部,分割線的底部則是item的底部+間距,所以有:

float top = view.getBottom();
float bottom = view.getBottom() + 10;
//繪制矩形
c.drawRect(left,top,right,bottom,paint);

實(shí)際效果圖:

onDrawOver()方法:

直接在剛才的基礎(chǔ)上,重寫onDrawOver()方法

@Override
public void onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
?? ?super.onDrawOver(c, parent, state);
? ? Paint paint = new Paint();
? ? paint.setColor(Color.RED);

? ? int count = parent.getChildCount();
? ? float left = parent.getRight() - 40;
? ? float right = parent.getRight();
? ? for (int i = 0; i < count; i++){
?? ? ? ?View view = parent.getChildAt(i);
?? ? ? ?float top = view.getTop();
?? ? ? ?//會覆蓋掉部分藍(lán)色分割線
?? ? ? ?float bottom = view.getBottom() + 5;
?? ? ? ?c.drawRect(left,top,right,bottom,paint);
?? ?}
}

之前說過,onDraw()方法繪圖的內(nèi)容將出現(xiàn)在視圖下方,而onDrawOver()方法的繪圖內(nèi)容會出現(xiàn)在視圖上方,因此這里的紅色分割線會略微覆蓋掉一部分之前的藍(lán)色分割線

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android SharedPreferences實(shí)現(xiàn)數(shù)據(jù)存儲功能

    Android SharedPreferences實(shí)現(xiàn)數(shù)據(jù)存儲功能

    這篇文章主要為大家詳細(xì)介紹了Android SharedPreferences實(shí)現(xiàn)數(shù)據(jù)存儲功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android判斷wifi是5G還是2.4G

    Android判斷wifi是5G還是2.4G

    這篇文章給大家分享android區(qū)分wifi是5G還是2.4G的方法,代碼簡單易懂,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2016-12-12
  • Android中TabLayout+ViewPager 簡單實(shí)現(xiàn)app底部Tab導(dǎo)航欄

    Android中TabLayout+ViewPager 簡單實(shí)現(xiàn)app底部Tab導(dǎo)航欄

    TabLayout 是Android com.android.support:design庫的一個控件。本文主要給大家介紹TabLayout+ViewPager 簡單實(shí)現(xiàn)app底部Tab布局,需要的的朋友參考下
    2017-02-02
  • 一篇文章揭開Kotlin協(xié)程的神秘面紗

    一篇文章揭開Kotlin協(xié)程的神秘面紗

    最近看了下Kotlin的協(xié)程,覺得挺好的,寫篇文章總結(jié)總結(jié),所以下面這篇文章主要給大家介紹了關(guān)于Kotlin協(xié)程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Android實(shí)現(xiàn)果凍滑動效果的控件

    Android實(shí)現(xiàn)果凍滑動效果的控件

    這篇文章給大家主要介紹了利用Android如何實(shí)現(xiàn)果凍效果滑動效果的控件,實(shí)現(xiàn)的效果類似于iOS有阻尼效果的滑動控件,一般我們比較親切地稱之為果凍控件,常見的如微信里[我]的那個面板模塊,即使沒有再多的選項(xiàng),也不會很生硬的不允許用戶滑動。下面來一起看看吧。
    2016-11-11
  • Android實(shí)現(xiàn)生成二維碼并保存到相冊

    Android實(shí)現(xiàn)生成二維碼并保存到相冊

    這篇文章主要介紹了如何利用Android實(shí)現(xiàn)二維碼的生成,并且保存到本地相冊。文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編學(xué)習(xí)一下
    2022-04-04
  • Android?全局通知彈窗示例分析詳解

    Android?全局通知彈窗示例分析詳解

    這篇文章主要為大家介紹了Android?全局通知彈窗實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 利用Kotlin Tools如何快速添加Kotlin依賴詳解

    利用Kotlin Tools如何快速添加Kotlin依賴詳解

    這篇文章主要給大家介紹了關(guān)于利用Kotlin Tools如何快速添加Kotlin依賴的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Android SQLite數(shù)據(jù)庫基本操作方法

    Android SQLite數(shù)據(jù)庫基本操作方法

    本篇文章主要介紹了Android SQLite數(shù)據(jù)庫基本操作方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • Android Color顏色過度計算實(shí)現(xiàn)代碼

    Android Color顏色過度計算實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android Color顏色過度計算實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論

佛山市| 旬阳县| 通榆县| 平阳县| 桂东县| 桑日县| 新源县| 上高县| 印江| 西乌| 贵德县| 府谷县| 灵台县| 海晏县| 平顶山市| 四川省| 连城县| 花垣县| 凤凰县| 凌海市| 迭部县| 田阳县| 睢宁县| 宁陕县| 托克逊县| 台前县| 富顺县| 赤水市| 陵水| 宁蒗| 台北市| 鲜城| 大名县| 商城县| 浮梁县| 临颍县| 泗洪县| 汉川市| 宿松县| 平陆县| 丁青县|