Skip to content

Commit

Permalink
feat: added support for multi item layouts in RecyclerViews
Browse files Browse the repository at this point in the history
  • Loading branch information
Blaž Vantur committed Aug 9, 2018
1 parent 776327d commit 22faa70
Show file tree
Hide file tree
Showing 1,855 changed files with 28,618 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package com.ethanhua.skeleton;

import android.support.annotation.ArrayRes;
import android.support.annotation.ColorRes;
import android.support.annotation.IntRange;
import android.support.annotation.LayoutRes;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;

import java.util.List;

/**
* Created by ethanhua on 2017/7/29.
*/
Expand All @@ -23,6 +26,7 @@ private RecyclerViewSkeletonScreen(Builder builder) {
mSkeletonAdapter = new SkeletonAdapter();
mSkeletonAdapter.setItemCount(builder.mItemCount);
mSkeletonAdapter.setLayoutReference(builder.mItemResID);
mSkeletonAdapter.setArrayOfLayoutReferences(builder.mItemsResIDArray);
mSkeletonAdapter.shimmer(builder.mShimmer);
mSkeletonAdapter.setShimmerColor(builder.mShimmerColor);
mSkeletonAdapter.setShimmerAngle(builder.mShimmerAngle);
Expand All @@ -49,6 +53,7 @@ public static class Builder {
private boolean mShimmer = true;
private int mItemCount = 10;
private int mItemResID = R.layout.layout_default_item_skeleton;
private int[] mItemsResIDArray;
private int mShimmerColor;
private int mShimmerDuration = 1000;
private int mShimmerAngle = 20;
Expand Down Expand Up @@ -118,6 +123,14 @@ public Builder load(@LayoutRes int skeletonLayoutResID) {
return this;
}

/**
* @param skeletonLayoutResIDs the loading array of skeleton layoutResID
*/
public Builder loadArrayOfLayouts(@ArrayRes int[] skeletonLayoutResIDs) {
this.mItemsResIDArray = skeletonLayoutResIDs;
return this;
}

/**
* @param frozen whether frozen recyclerView during skeleton showing
* @return
Expand Down
38 changes: 38 additions & 0 deletions library/src/main/java/com/ethanhua/skeleton/SkeletonAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,14 @@

import android.support.annotation.IntRange;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.ViewGroup;

import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

import io.supercharge.shimmerlayout.ShimmerLayout;

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

private int mItemCount;
private int mLayoutReference;
private int[] mLayoutArrayReferences;
private int mColor;
private boolean mShimmer;
private int mShimmerDuration;
Expand All @@ -23,9 +29,13 @@ public class SkeletonAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
if (doesArrayOfLayoutsExist()) {
mLayoutReference = viewType;
}
if (mShimmer) {
return new ShimmerViewHolder(inflater, parent, mLayoutReference);
}

return new RecyclerView.ViewHolder(inflater.inflate(mLayoutReference, parent, false)) {
};
}
Expand All @@ -41,6 +51,19 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
}

@Override
public int getItemViewType(int position) {
if(doesArrayOfLayoutsExist()) {
return getCorrectLayoutItem(position);
}
return super.getItemViewType(position);
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public int getItemCount() {
return mItemCount;
Expand All @@ -50,6 +73,10 @@ public void setLayoutReference(int layoutReference) {
this.mLayoutReference = layoutReference;
}

public void setArrayOfLayoutReferences(int[] layoutReferences) {
this.mLayoutArrayReferences = layoutReferences;
}

public void setItemCount(int itemCount) {
this.mItemCount = itemCount;
}
Expand All @@ -69,4 +96,15 @@ public void setShimmerDuration(int shimmerDuration) {
public void setShimmerAngle(@IntRange(from = 0, to = 30) int shimmerAngle) {
this.mShimmerAngle = shimmerAngle;
}

public int getCorrectLayoutItem(int position) {
if(doesArrayOfLayoutsExist()) {
return mLayoutArrayReferences[position % mLayoutArrayReferences.length];
}
return mLayoutReference;
}

private boolean doesArrayOfLayoutsExist() {
return mLayoutArrayReferences != null && mLayoutArrayReferences.length != 0;
}
}
6 changes: 3 additions & 3 deletions sample/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ dependencies {
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
//implementation project(':library')
implementation 'com.ethanhua:skeleton:1.1.1'
implementation 'io.supercharge:shimmerlayout:2.1.0'
implementation project(':library')
// implementation 'com.ethanhua:skeleton:1.1.1'
// implementation 'io.supercharge:shimmerlayout:2.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.android.support:appcompat-v7:26.1.0'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.ethanhua.skeleton.sample;

public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.ethanhua.skeleton.sample";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 6;
public static final String VERSION_NAME = "1.0.0";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* gradle plugin from the resource data it found. It
* should not be modified by hand.
*/
package android.arch.lifecycle;

public final class R {
}
129 changes: 129 additions & 0 deletions sample/build/generated/source/r/debug/android/support/compat/R.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
/* AUTO-GENERATED FILE. DO NOT MODIFY.
*
* This class was automatically generated by the
* gradle plugin from the resource data it found. It
* should not be modified by hand.
*/
package android.support.compat;

public final class R {
public static final class attr {
public static final int font = 0x7f020075;
public static final int fontProviderAuthority = 0x7f020077;
public static final int fontProviderCerts = 0x7f020078;
public static final int fontProviderFetchStrategy = 0x7f020079;
public static final int fontProviderFetchTimeout = 0x7f02007a;
public static final int fontProviderPackage = 0x7f02007b;
public static final int fontProviderQuery = 0x7f02007c;
public static final int fontStyle = 0x7f02007d;
public static final int fontWeight = 0x7f02007e;
}
public static final class bool {
public static final int abc_action_bar_embed_tabs = 0x7f030000;
}
public static final class color {
public static final int notification_action_color_filter = 0x7f040045;
public static final int notification_icon_bg_color = 0x7f040046;
public static final int ripple_material_light = 0x7f040051;
public static final int secondary_text_default_material_light = 0x7f040053;
}
public static final class dimen {
public static final int compat_button_inset_horizontal_material = 0x7f05004a;
public static final int compat_button_inset_vertical_material = 0x7f05004b;
public static final int compat_button_padding_horizontal_material = 0x7f05004c;
public static final int compat_button_padding_vertical_material = 0x7f05004d;
public static final int compat_control_corner_material = 0x7f05004e;
public static final int notification_action_icon_size = 0x7f05005e;
public static final int notification_action_text_size = 0x7f05005f;
public static final int notification_big_circle_margin = 0x7f050060;
public static final int notification_content_margin_start = 0x7f050061;
public static final int notification_large_icon_height = 0x7f050062;
public static final int notification_large_icon_width = 0x7f050063;
public static final int notification_main_column_padding_top = 0x7f050064;
public static final int notification_media_narrow_margin = 0x7f050065;
public static final int notification_right_icon_size = 0x7f050066;
public static final int notification_right_side_padding_top = 0x7f050067;
public static final int notification_small_icon_background_padding = 0x7f050068;
public static final int notification_small_icon_size_as_large = 0x7f050069;
public static final int notification_subtext_size = 0x7f05006a;
public static final int notification_top_pad = 0x7f05006b;
public static final int notification_top_pad_large_text = 0x7f05006c;
}
public static final class drawable {
public static final int notification_action_background = 0x7f06005d;
public static final int notification_bg = 0x7f06005e;
public static final int notification_bg_low = 0x7f06005f;
public static final int notification_bg_low_normal = 0x7f060060;
public static final int notification_bg_low_pressed = 0x7f060061;
public static final int notification_bg_normal = 0x7f060062;
public static final int notification_bg_normal_pressed = 0x7f060063;
public static final int notification_icon_background = 0x7f060064;
public static final int notification_template_icon_bg = 0x7f060065;
public static final int notification_template_icon_low_bg = 0x7f060066;
public static final int notification_tile_bg = 0x7f060067;
public static final int notify_panel_notification_icon_bg = 0x7f060068;
}
public static final class id {
public static final int action_container = 0x7f07000e;
public static final int action_divider = 0x7f070010;
public static final int action_image = 0x7f070011;
public static final int action_text = 0x7f070017;
public static final int actions = 0x7f070018;
public static final int async = 0x7f07001e;
public static final int blocking = 0x7f070024;
public static final int chronometer = 0x7f070034;
public static final int forever = 0x7f070047;
public static final int icon = 0x7f07004a;
public static final int icon_group = 0x7f07004b;
public static final int info = 0x7f070054;
public static final int italic = 0x7f070055;
public static final int line1 = 0x7f070058;
public static final int line3 = 0x7f070059;
public static final int normal = 0x7f070062;
public static final int notification_background = 0x7f070063;
public static final int notification_main_column = 0x7f070064;
public static final int notification_main_column_container = 0x7f070065;
public static final int right_icon = 0x7f07006d;
public static final int right_side = 0x7f07006e;
public static final int text = 0x7f07008e;
public static final int text2 = 0x7f07008f;
public static final int time = 0x7f070092;
public static final int title = 0x7f070093;
}
public static final class integer {
public static final int status_bar_notification_info_maxnum = 0x7f080004;
}
public static final class layout {
public static final int notification_action = 0x7f09002e;
public static final int notification_action_tombstone = 0x7f09002f;
public static final int notification_template_custom_big = 0x7f090036;
public static final int notification_template_icon_group = 0x7f090037;
public static final int notification_template_part_chronometer = 0x7f09003b;
public static final int notification_template_part_time = 0x7f09003c;
}
public static final class string {
public static final int status_bar_notification_info_overflow = 0x7f0b0022;
}
public static final class style {
public static final int TextAppearance_Compat_Notification = 0x7f0c00fa;
public static final int TextAppearance_Compat_Notification_Info = 0x7f0c00fb;
public static final int TextAppearance_Compat_Notification_Line2 = 0x7f0c00fd;
public static final int TextAppearance_Compat_Notification_Time = 0x7f0c0100;
public static final int TextAppearance_Compat_Notification_Title = 0x7f0c0102;
public static final int Widget_Compat_NotificationActionContainer = 0x7f0c016b;
public static final int Widget_Compat_NotificationActionText = 0x7f0c016c;
}
public static final class styleable {
public static final int[] FontFamily = { 0x7f020077, 0x7f020078, 0x7f020079, 0x7f02007a, 0x7f02007b, 0x7f02007c };
public static final int FontFamily_fontProviderAuthority = 0;
public static final int FontFamily_fontProviderCerts = 1;
public static final int FontFamily_fontProviderFetchStrategy = 2;
public static final int FontFamily_fontProviderFetchTimeout = 3;
public static final int FontFamily_fontProviderPackage = 4;
public static final int FontFamily_fontProviderQuery = 5;
public static final int[] FontFamilyFont = { 0x7f020075, 0x7f02007d, 0x7f02007e };
public static final int FontFamilyFont_font = 0;
public static final int FontFamilyFont_fontStyle = 1;
public static final int FontFamilyFont_fontWeight = 2;
}
}

0 comments on commit 22faa70

Please sign in to comment.