Skip to content

Commit 22faa70

Browse files
author
Blaž Vantur
committed
feat: added support for multi item layouts in RecyclerViews
1 parent 776327d commit 22faa70

File tree

1,855 files changed

+28618
-3
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,855 files changed

+28618
-3
lines changed

library/src/main/java/com/ethanhua/skeleton/RecyclerViewSkeletonScreen.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.ethanhua.skeleton;
22

3+
import android.support.annotation.ArrayRes;
34
import android.support.annotation.ColorRes;
45
import android.support.annotation.IntRange;
56
import android.support.annotation.LayoutRes;
67
import android.support.v4.content.ContextCompat;
78
import android.support.v7.widget.RecyclerView;
89

10+
import java.util.List;
11+
912
/**
1013
* Created by ethanhua on 2017/7/29.
1114
*/
@@ -23,6 +26,7 @@ private RecyclerViewSkeletonScreen(Builder builder) {
2326
mSkeletonAdapter = new SkeletonAdapter();
2427
mSkeletonAdapter.setItemCount(builder.mItemCount);
2528
mSkeletonAdapter.setLayoutReference(builder.mItemResID);
29+
mSkeletonAdapter.setArrayOfLayoutReferences(builder.mItemsResIDArray);
2630
mSkeletonAdapter.shimmer(builder.mShimmer);
2731
mSkeletonAdapter.setShimmerColor(builder.mShimmerColor);
2832
mSkeletonAdapter.setShimmerAngle(builder.mShimmerAngle);
@@ -49,6 +53,7 @@ public static class Builder {
4953
private boolean mShimmer = true;
5054
private int mItemCount = 10;
5155
private int mItemResID = R.layout.layout_default_item_skeleton;
56+
private int[] mItemsResIDArray;
5257
private int mShimmerColor;
5358
private int mShimmerDuration = 1000;
5459
private int mShimmerAngle = 20;
@@ -118,6 +123,14 @@ public Builder load(@LayoutRes int skeletonLayoutResID) {
118123
return this;
119124
}
120125

126+
/**
127+
* @param skeletonLayoutResIDs the loading array of skeleton layoutResID
128+
*/
129+
public Builder loadArrayOfLayouts(@ArrayRes int[] skeletonLayoutResIDs) {
130+
this.mItemsResIDArray = skeletonLayoutResIDs;
131+
return this;
132+
}
133+
121134
/**
122135
* @param frozen whether frozen recyclerView during skeleton showing
123136
* @return

library/src/main/java/com/ethanhua/skeleton/SkeletonAdapter.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@
22

33
import android.support.annotation.IntRange;
44
import android.support.v7.widget.RecyclerView;
5+
import android.util.Log;
56
import android.view.LayoutInflater;
67
import android.view.ViewGroup;
78

9+
import java.util.Arrays;
10+
import java.util.Collections;
11+
import java.util.Random;
12+
813
import io.supercharge.shimmerlayout.ShimmerLayout;
914

1015
/**
@@ -15,6 +20,7 @@ public class SkeletonAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
1520

1621
private int mItemCount;
1722
private int mLayoutReference;
23+
private int[] mLayoutArrayReferences;
1824
private int mColor;
1925
private boolean mShimmer;
2026
private int mShimmerDuration;
@@ -23,9 +29,13 @@ public class SkeletonAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
2329
@Override
2430
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
2531
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
32+
if (doesArrayOfLayoutsExist()) {
33+
mLayoutReference = viewType;
34+
}
2635
if (mShimmer) {
2736
return new ShimmerViewHolder(inflater, parent, mLayoutReference);
2837
}
38+
2939
return new RecyclerView.ViewHolder(inflater.inflate(mLayoutReference, parent, false)) {
3040
};
3141
}
@@ -41,6 +51,19 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
4151
}
4252
}
4353

54+
@Override
55+
public int getItemViewType(int position) {
56+
if(doesArrayOfLayoutsExist()) {
57+
return getCorrectLayoutItem(position);
58+
}
59+
return super.getItemViewType(position);
60+
}
61+
62+
@Override
63+
public long getItemId(int position) {
64+
return position;
65+
}
66+
4467
@Override
4568
public int getItemCount() {
4669
return mItemCount;
@@ -50,6 +73,10 @@ public void setLayoutReference(int layoutReference) {
5073
this.mLayoutReference = layoutReference;
5174
}
5275

76+
public void setArrayOfLayoutReferences(int[] layoutReferences) {
77+
this.mLayoutArrayReferences = layoutReferences;
78+
}
79+
5380
public void setItemCount(int itemCount) {
5481
this.mItemCount = itemCount;
5582
}
@@ -69,4 +96,15 @@ public void setShimmerDuration(int shimmerDuration) {
6996
public void setShimmerAngle(@IntRange(from = 0, to = 30) int shimmerAngle) {
7097
this.mShimmerAngle = shimmerAngle;
7198
}
99+
100+
public int getCorrectLayoutItem(int position) {
101+
if(doesArrayOfLayoutsExist()) {
102+
return mLayoutArrayReferences[position % mLayoutArrayReferences.length];
103+
}
104+
return mLayoutReference;
105+
}
106+
107+
private boolean doesArrayOfLayoutsExist() {
108+
return mLayoutArrayReferences != null && mLayoutArrayReferences.length != 0;
109+
}
72110
}

sample/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ dependencies {
2323
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
2424
exclude group: 'com.android.support', module: 'support-annotations'
2525
})
26-
//implementation project(':library')
27-
implementation 'com.ethanhua:skeleton:1.1.1'
28-
implementation 'io.supercharge:shimmerlayout:2.1.0'
26+
implementation project(':library')
27+
// implementation 'com.ethanhua:skeleton:1.1.1'
28+
// implementation 'io.supercharge:shimmerlayout:2.1.0'
2929
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
3030
implementation 'com.android.support:recyclerview-v7:26.1.0'
3131
implementation 'com.android.support:appcompat-v7:26.1.0'
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* Automatically generated file. DO NOT MODIFY
3+
*/
4+
package com.ethanhua.skeleton.sample;
5+
6+
public final class BuildConfig {
7+
public static final boolean DEBUG = Boolean.parseBoolean("true");
8+
public static final String APPLICATION_ID = "com.ethanhua.skeleton.sample";
9+
public static final String BUILD_TYPE = "debug";
10+
public static final String FLAVOR = "";
11+
public static final int VERSION_CODE = 6;
12+
public static final String VERSION_NAME = "1.0.0";
13+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/* AUTO-GENERATED FILE. DO NOT MODIFY.
2+
*
3+
* This class was automatically generated by the
4+
* gradle plugin from the resource data it found. It
5+
* should not be modified by hand.
6+
*/
7+
package android.arch.lifecycle;
8+
9+
public final class R {
10+
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/* AUTO-GENERATED FILE. DO NOT MODIFY.
2+
*
3+
* This class was automatically generated by the
4+
* gradle plugin from the resource data it found. It
5+
* should not be modified by hand.
6+
*/
7+
package android.support.compat;
8+
9+
public final class R {
10+
public static final class attr {
11+
public static final int font = 0x7f020075;
12+
public static final int fontProviderAuthority = 0x7f020077;
13+
public static final int fontProviderCerts = 0x7f020078;
14+
public static final int fontProviderFetchStrategy = 0x7f020079;
15+
public static final int fontProviderFetchTimeout = 0x7f02007a;
16+
public static final int fontProviderPackage = 0x7f02007b;
17+
public static final int fontProviderQuery = 0x7f02007c;
18+
public static final int fontStyle = 0x7f02007d;
19+
public static final int fontWeight = 0x7f02007e;
20+
}
21+
public static final class bool {
22+
public static final int abc_action_bar_embed_tabs = 0x7f030000;
23+
}
24+
public static final class color {
25+
public static final int notification_action_color_filter = 0x7f040045;
26+
public static final int notification_icon_bg_color = 0x7f040046;
27+
public static final int ripple_material_light = 0x7f040051;
28+
public static final int secondary_text_default_material_light = 0x7f040053;
29+
}
30+
public static final class dimen {
31+
public static final int compat_button_inset_horizontal_material = 0x7f05004a;
32+
public static final int compat_button_inset_vertical_material = 0x7f05004b;
33+
public static final int compat_button_padding_horizontal_material = 0x7f05004c;
34+
public static final int compat_button_padding_vertical_material = 0x7f05004d;
35+
public static final int compat_control_corner_material = 0x7f05004e;
36+
public static final int notification_action_icon_size = 0x7f05005e;
37+
public static final int notification_action_text_size = 0x7f05005f;
38+
public static final int notification_big_circle_margin = 0x7f050060;
39+
public static final int notification_content_margin_start = 0x7f050061;
40+
public static final int notification_large_icon_height = 0x7f050062;
41+
public static final int notification_large_icon_width = 0x7f050063;
42+
public static final int notification_main_column_padding_top = 0x7f050064;
43+
public static final int notification_media_narrow_margin = 0x7f050065;
44+
public static final int notification_right_icon_size = 0x7f050066;
45+
public static final int notification_right_side_padding_top = 0x7f050067;
46+
public static final int notification_small_icon_background_padding = 0x7f050068;
47+
public static final int notification_small_icon_size_as_large = 0x7f050069;
48+
public static final int notification_subtext_size = 0x7f05006a;
49+
public static final int notification_top_pad = 0x7f05006b;
50+
public static final int notification_top_pad_large_text = 0x7f05006c;
51+
}
52+
public static final class drawable {
53+
public static final int notification_action_background = 0x7f06005d;
54+
public static final int notification_bg = 0x7f06005e;
55+
public static final int notification_bg_low = 0x7f06005f;
56+
public static final int notification_bg_low_normal = 0x7f060060;
57+
public static final int notification_bg_low_pressed = 0x7f060061;
58+
public static final int notification_bg_normal = 0x7f060062;
59+
public static final int notification_bg_normal_pressed = 0x7f060063;
60+
public static final int notification_icon_background = 0x7f060064;
61+
public static final int notification_template_icon_bg = 0x7f060065;
62+
public static final int notification_template_icon_low_bg = 0x7f060066;
63+
public static final int notification_tile_bg = 0x7f060067;
64+
public static final int notify_panel_notification_icon_bg = 0x7f060068;
65+
}
66+
public static final class id {
67+
public static final int action_container = 0x7f07000e;
68+
public static final int action_divider = 0x7f070010;
69+
public static final int action_image = 0x7f070011;
70+
public static final int action_text = 0x7f070017;
71+
public static final int actions = 0x7f070018;
72+
public static final int async = 0x7f07001e;
73+
public static final int blocking = 0x7f070024;
74+
public static final int chronometer = 0x7f070034;
75+
public static final int forever = 0x7f070047;
76+
public static final int icon = 0x7f07004a;
77+
public static final int icon_group = 0x7f07004b;
78+
public static final int info = 0x7f070054;
79+
public static final int italic = 0x7f070055;
80+
public static final int line1 = 0x7f070058;
81+
public static final int line3 = 0x7f070059;
82+
public static final int normal = 0x7f070062;
83+
public static final int notification_background = 0x7f070063;
84+
public static final int notification_main_column = 0x7f070064;
85+
public static final int notification_main_column_container = 0x7f070065;
86+
public static final int right_icon = 0x7f07006d;
87+
public static final int right_side = 0x7f07006e;
88+
public static final int text = 0x7f07008e;
89+
public static final int text2 = 0x7f07008f;
90+
public static final int time = 0x7f070092;
91+
public static final int title = 0x7f070093;
92+
}
93+
public static final class integer {
94+
public static final int status_bar_notification_info_maxnum = 0x7f080004;
95+
}
96+
public static final class layout {
97+
public static final int notification_action = 0x7f09002e;
98+
public static final int notification_action_tombstone = 0x7f09002f;
99+
public static final int notification_template_custom_big = 0x7f090036;
100+
public static final int notification_template_icon_group = 0x7f090037;
101+
public static final int notification_template_part_chronometer = 0x7f09003b;
102+
public static final int notification_template_part_time = 0x7f09003c;
103+
}
104+
public static final class string {
105+
public static final int status_bar_notification_info_overflow = 0x7f0b0022;
106+
}
107+
public static final class style {
108+
public static final int TextAppearance_Compat_Notification = 0x7f0c00fa;
109+
public static final int TextAppearance_Compat_Notification_Info = 0x7f0c00fb;
110+
public static final int TextAppearance_Compat_Notification_Line2 = 0x7f0c00fd;
111+
public static final int TextAppearance_Compat_Notification_Time = 0x7f0c0100;
112+
public static final int TextAppearance_Compat_Notification_Title = 0x7f0c0102;
113+
public static final int Widget_Compat_NotificationActionContainer = 0x7f0c016b;
114+
public static final int Widget_Compat_NotificationActionText = 0x7f0c016c;
115+
}
116+
public static final class styleable {
117+
public static final int[] FontFamily = { 0x7f020077, 0x7f020078, 0x7f020079, 0x7f02007a, 0x7f02007b, 0x7f02007c };
118+
public static final int FontFamily_fontProviderAuthority = 0;
119+
public static final int FontFamily_fontProviderCerts = 1;
120+
public static final int FontFamily_fontProviderFetchStrategy = 2;
121+
public static final int FontFamily_fontProviderFetchTimeout = 3;
122+
public static final int FontFamily_fontProviderPackage = 4;
123+
public static final int FontFamily_fontProviderQuery = 5;
124+
public static final int[] FontFamilyFont = { 0x7f020075, 0x7f02007d, 0x7f02007e };
125+
public static final int FontFamilyFont_font = 0;
126+
public static final int FontFamilyFont_fontStyle = 1;
127+
public static final int FontFamilyFont_fontWeight = 2;
128+
}
129+
}

0 commit comments

Comments
 (0)