Advertisement
Guest User

ExpandableLayout.java

a guest
May 20th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.83 KB | None | 0 0
  1. package com.nwt.labelspinner.expandable;
  2.  
  3. import android.animation.ObjectAnimator;
  4. import android.content.Context;
  5. import android.content.res.TypedArray;
  6. import android.util.AttributeSet;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.widget.FrameLayout;
  10. import android.widget.ImageView;
  11. import android.widget.Switch;
  12. import android.widget.TextView;
  13. import androidx.annotation.NonNull;
  14. import androidx.annotation.Nullable;
  15. import androidx.constraintlayout.widget.ConstraintLayout;
  16. import androidx.recyclerview.widget.RecyclerView;
  17. import com.nwt.labelspinner.R;
  18. import org.jetbrains.annotations.NotNull;
  19.  
  20. public class ExpandableLayout extends FrameLayout {
  21.  
  22. private ExpandableLayoutView expandableLayoutView;
  23. private TextView mExpandableLable;
  24. private ConstraintLayout rexlExpandable;
  25. private Switch expandableSwitch;
  26. private ImageView expandableIcon;
  27. private ImageView ivHeaderIcon;
  28. private RecyclerView expandableRv;
  29. private String label = "";
  30. private boolean isExpanded = false;
  31. private int expandedType = 0;
  32. private boolean isEnable = true;
  33. private int headerIcon = R.drawable.ic_drop_down_black;
  34. private ExpandableLayoutListener listener = new ExpandableLayoutListener() {
  35. @Override
  36. public void open(@NotNull ExpandableLayoutView view) {
  37. }
  38.  
  39. @Override
  40. public void close(@NotNull ExpandableLayoutView view) {
  41. }
  42.  
  43. @Override
  44. public void start(@NotNull ExpandableLayoutView view) {
  45. }
  46. };
  47.  
  48. public ExpandableLayout(@NonNull Context context) {
  49. this(context, null);
  50. }
  51.  
  52.  
  53. public ExpandableLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
  54. this(context, attrs, 0);
  55. }
  56.  
  57. public ExpandableLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  58. super(context, attrs, defStyleAttr);
  59. addLayoutView();
  60. addAttrs(context, attrs);
  61. }
  62.  
  63. private void addAttrs(Context context, AttributeSet attrs) {
  64. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ExpandableLayout, 0, 0);
  65. try {
  66. setLabel(a.getString(R.styleable.ExpandableLayout_label));
  67. setExpanded(a.getBoolean(R.styleable.ExpandableLayout_exp_expanded, false));
  68. setExpandedType(
  69. ExpFormat.fromId(a.getInt(R.styleable.ExpandableLayout_exp_right_type, 1)).id
  70. );
  71. setHeaderIcon(
  72. a.getResourceId(R.styleable.ExpandableLayout_exp_header_icon, R.drawable.ic_drop_down_black)
  73. );
  74. } finally {
  75. a.recycle();
  76. }
  77. }
  78.  
  79. private void addLayoutView() {
  80. addView(LayoutInflater.from(getContext()).inflate(R.layout.expandable_layout, this, false));
  81. }
  82.  
  83. public void setLabel(String label) {
  84. this.label = label;
  85. mExpandableLable.setText(this.label);
  86. }
  87.  
  88. public void setExpanded(boolean isExpanded) {
  89. this.isExpanded = isExpanded;
  90. expandableSwitch.setChecked(this.isExpanded);
  91. changeIcon(!this.isExpanded);
  92. if (this.isExpanded) {
  93. expandableLayoutView.expand();
  94. } else {
  95. expandableLayoutView.collapse();
  96. }
  97. }
  98.  
  99. public void setExpandedType(int type) {
  100. this.expandedType = type;
  101. expandableSwitch.setVisibility(
  102. (this.expandedType == ExpandableType.ICON) ? View.INVISIBLE : View.VISIBLE
  103. );
  104. expandableIcon.setVisibility(
  105. (this.expandedType == ExpandableType.SWITCH) ? View.INVISIBLE : View.VISIBLE
  106. );
  107. }
  108.  
  109. public void toggle() {
  110. expandableLayoutView.toggle();
  111. expandableSwitch.toggle();
  112. }
  113.  
  114. public void setEnable(boolean isEnable) {
  115. this.isEnable = isEnable;
  116. rexlExpandable.setEnabled(this.isEnable);
  117. expandableSwitch.setEnabled(this.isEnable);
  118. expandableIcon.setEnabled(this.isEnable);
  119. }
  120.  
  121. public void setHeaderIcon(int headerIcon) {
  122. this.headerIcon = headerIcon;
  123. ivHeaderIcon.setImageResource(this.headerIcon);
  124. }
  125.  
  126. private void changeIcon(boolean isOpen) {
  127. if (isOpen) {
  128. createRotateAnimator(expandableIcon, 0f, 180f).start();
  129. } else {
  130. createRotateAnimator(expandableIcon, 180f, 0f).start();
  131. }
  132. }
  133.  
  134. public void listener(ExpandableLayoutListener listener) {
  135. this.listener = listener;
  136. expandableLayoutView.setOnExpandListener(listener);
  137. }
  138.  
  139. public void setUpRv(RecyclerView.LayoutManager layoutManager, RecyclerView.Adapter adapter, boolean isNestedScrollingEnabled) {
  140. expandableRv.setLayoutManager(layoutManager);
  141. expandableRv.setAdapter(adapter);
  142. expandableRv.setNestedScrollingEnabled(isNestedScrollingEnabled);
  143. }
  144.  
  145. public void addItemDecoration(RecyclerView.ItemDecoration itemDecoration) {
  146. expandableRv.addItemDecoration(itemDecoration);
  147. }
  148.  
  149. private ObjectAnimator createRotateAnimator(View target, float from, float to) {
  150. ObjectAnimator animator = ObjectAnimator.ofFloat(target, "rotation", from, to);
  151. animator.setDuration(300);
  152. animator.setInterpolator(Utils.createInterpolator(Utils.LINEAR_INTERPOLATOR));
  153. return animator;
  154. }
  155.  
  156. private enum ExpFormat {
  157. expSwitch(0), expIcon(1);
  158. int id;
  159.  
  160. ExpFormat(int i) {
  161. this.id = i;
  162. }
  163.  
  164. public static ExpFormat fromId(int id) {
  165. for (ExpFormat f : values()) {
  166. if (f.id == id) return f;
  167. }
  168. throw new IllegalArgumentException();
  169. }
  170. }
  171.  
  172. class ExpandableType {
  173. public static final int SWITCH = 0;
  174. public static final int ICON = 1;
  175. }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement