diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 6a2d096..0000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,86 +0,0 @@ -version: 2.1 -jobs: - build: - working_directory: ~/code - docker: - - image: circleci/android:api-29 - environment: - JVM_OPTS: -Xmx3200m - steps: - - checkout - - restore_cache: - key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} - - run: - name: Download Dependencies - command: ./gradlew androidDependencies - - save_cache: - paths: - - ~/.gradle - key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} - - tests: - working_directory: ~/code - docker: - - image: circleci/android:api-29 - environment: - JVM_OPTS: -Xmx3200m - steps: - - checkout - - restore_cache: - key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} - - store_artifacts: - path: app/build/reports - destination: reports - - run: - name: Run Lint Test - command: ./gradlew lint - - run: - name: Run Tests - command: ./gradlew lint test - - store_artifacts: - path: app/build/reports - destination: reports - - store_test_results: - path: app/build/test-results - - deploy: - working_directory: ~/code - docker: - - image: circleci/android:api-29 - environment: - JVM_OPTS: -Xmx3200m - steps: - - checkout - - restore_cache: - key: jars-{{ checksum "build.gradle" }}-{{ checksum "app/build.gradle" }} - - run: - name: Build Library - command: ./gradlew :expandable-recyclerview:assembleRelease - - run: - name: Export key - command: | - mkdir expandable-recyclerview/maven - echo ${GPG_KEY_CONTENTS} | base64 -d --ignore-garbage > expandable-recyclerview/maven/secret.gpg - - run: - name: Staging - command: ./gradlew :expandable-recyclerview:publishReleasePublicationToSonatypeRepository - - run: - name: Release Library - command: ./gradlew closeAndReleaseRepository - -workflows: - version: 2.1 - build-and-deploy: - jobs: - - build: - filters: # required since `deploy` has tag filters AND requires `build` - tags: - only: /.*/ - - deploy: - requires: - - build - filters: - tags: - only: /v[0-9]{1,3}\.[0-9]{1,3}\.?[0-9]{0,3}.*/ - branches: - ignore: /.*/ \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8a21a2a..bc4d112 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -23,9 +23,6 @@ android { buildFeatures { viewBinding true } - dataBinding { - enabled = true - } } dependencies { @@ -34,8 +31,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.5.1' implementation 'androidx.core:core-ktx:1.9.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - - implementation project(path: ':expandable-recyclerview') + implementation 'com.github.adriankuta:expandable-recyclerView:2.1.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.4' diff --git a/app/src/main/java/com/github/adriankuta/ExpandableAdapter.kt b/app/src/main/java/com/github/adriankuta/ExpandableAdapter.kt index 500d361..a387d42 100644 --- a/app/src/main/java/com/github/adriankuta/ExpandableAdapter.kt +++ b/app/src/main/java/com/github/adriankuta/ExpandableAdapter.kt @@ -3,6 +3,7 @@ package com.github.adriankuta import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.view.isGone import androidx.recyclerview.widget.RecyclerView import com.github.adriankuta.databinding.ItemLevel1Binding import com.github.adriankuta.databinding.ItemLevel2Binding @@ -12,16 +13,16 @@ import com.github.adriankuta.expandable_recyclerview.ExpandableTreeNode import com.github.adriankuta.expandable_recyclerview.expandableTree class ExpandableAdapter : - ExpandableRecyclerViewAdapter() { + ExpandableRecyclerViewAdapter() { - private var tree: ExpandableTreeNode? = null + private var tree: ExpandableTreeNode? = null - fun setTree(tree: ExpandableTreeNode) { + fun setTree(tree: ExpandableTreeNode) { this.tree = tree notifyDataSetChanged() } - override fun getTreeNodes(): ExpandableTreeNode = tree ?: expandableTree("") + override fun getTreeNodes(): ExpandableTreeNode = tree ?: expandableTree(Region("")) override fun onCreateViewHolder(parent: ViewGroup, nestLevel: Int): ExpandableViewHolder { return when (nestLevel) { @@ -34,7 +35,7 @@ class ExpandableAdapter : override fun onBindViewHolder( holder: ExpandableViewHolder, - treeNode: ExpandableTreeNode, + treeNode: ExpandableTreeNode, nestLevel: Int ) { holder.bind(treeNode) { @@ -46,41 +47,65 @@ class ExpandableAdapter : class Level1(private val binding: ItemLevel1Binding) : ExpandableViewHolder(binding.root) { override fun bind( - node: ExpandableTreeNode, - onClickListener: ((ExpandableTreeNode) -> Unit)? + node: ExpandableTreeNode, + onClickListener: ((ExpandableTreeNode) -> Unit)? ) { - binding.node = node - binding.root.setOnClickListener { onClickListener?.invoke(node) } - binding.executePendingBindings() + binding.apply { + root.setOnClickListener { onClickListener?.invoke(node) } + textView.text = node.value.name + expandIcon.isGone = node.children.isEmpty() + expandIcon.setImageResource( + if (node.expanded) + R.drawable.ic_expand_less_black_24dp + else + R.drawable.ic_expand_more_black_24dp + ) + } } } class Level2(private val binding: ItemLevel2Binding) : ExpandableViewHolder(binding.root) { override fun bind( - node: ExpandableTreeNode, - onClickListener: ((ExpandableTreeNode) -> Unit)? + node: ExpandableTreeNode, + onClickListener: ((ExpandableTreeNode) -> Unit)? ) { - binding.node = node - binding.root.setOnClickListener { onClickListener?.invoke(node) } - binding.executePendingBindings() + binding.apply { + root.setOnClickListener { onClickListener?.invoke(node) } + textView.text = node.value.name + expandIcon.isGone = node.children.isEmpty() + expandIcon.setImageResource( + if (node.expanded) + R.drawable.ic_expand_less_black_24dp + else + R.drawable.ic_expand_more_black_24dp + ) + } } } class Level3(private val binding: ItemLevel3Binding) : ExpandableViewHolder(binding.root) { override fun bind( - node: ExpandableTreeNode, - onClickListener: ((ExpandableTreeNode) -> Unit)? + node: ExpandableTreeNode, + onClickListener: ((ExpandableTreeNode) -> Unit)? ) { - binding.node = node - binding.root.setOnClickListener { onClickListener?.invoke(node) } - binding.executePendingBindings() + binding.apply { + root.setOnClickListener { onClickListener?.invoke(node) } + textView.text = node.value.name + expandIcon.isGone = node.children.isEmpty() + expandIcon.setImageResource( + if (node.expanded) + R.drawable.ic_expand_less_black_24dp + else + R.drawable.ic_expand_more_black_24dp + ) + } } } abstract fun bind( - node: ExpandableTreeNode, - onClickListener: ((ExpandableTreeNode) -> Unit)? = null + node: ExpandableTreeNode, + onClickListener: ((ExpandableTreeNode) -> Unit)? = null ) } diff --git a/app/src/main/java/com/github/adriankuta/MainActivity.kt b/app/src/main/java/com/github/adriankuta/MainActivity.kt index 59cd3f5..357e6c2 100644 --- a/app/src/main/java/com/github/adriankuta/MainActivity.kt +++ b/app/src/main/java/com/github/adriankuta/MainActivity.kt @@ -9,23 +9,24 @@ class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) - val tree = expandableTree("World") { - child("North America") { - child("USA") + val tree = expandableTree(Region("World")) { + child(Region("North America")) { + child(Region("USA")) } - child("Europe") { - child("Poland") { - child("Warsaw") + child(Region("Europe")) { + child(Region("Poland")) { + child(Region("Warsaw")) } - child("Germany") + child(Region("Germany")) } - child("Asia") { - child("China") + child(Region("Asia")) { + child(Region("China")) } } diff --git a/app/src/main/java/com/github/adriankuta/Region.kt b/app/src/main/java/com/github/adriankuta/Region.kt new file mode 100644 index 0000000..4143684 --- /dev/null +++ b/app/src/main/java/com/github/adriankuta/Region.kt @@ -0,0 +1,3 @@ +package com.github.adriankuta + +data class Region(val name: String) \ No newline at end of file diff --git a/app/src/main/res/layout/item_level_1.xml b/app/src/main/res/layout/item_level_1.xml index d87431d..8f5726d 100644 --- a/app/src/main/res/layout/item_level_1.xml +++ b/app/src/main/res/layout/item_level_1.xml @@ -1,44 +1,31 @@ - + - + - - - - - - - - - - - - \ No newline at end of file + android:padding="8dp" + android:text="@{node.value}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/expand_icon" + app:layout_constraintTop_toTopOf="parent" + tools:text="@tools:sample/full_names" /> + diff --git a/app/src/main/res/layout/item_level_2.xml b/app/src/main/res/layout/item_level_2.xml index f2a6084..e65ae06 100644 --- a/app/src/main/res/layout/item_level_2.xml +++ b/app/src/main/res/layout/item_level_2.xml @@ -1,46 +1,33 @@ - + - + - - - - - - - - - - - - \ No newline at end of file + android:padding="8dp" + android:text="@{node.value}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/expand_icon" + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginStart="48dp" + tools:text="@tools:sample/full_names" /> + diff --git a/app/src/main/res/layout/item_level_3.xml b/app/src/main/res/layout/item_level_3.xml index a5e147f..64603f0 100644 --- a/app/src/main/res/layout/item_level_3.xml +++ b/app/src/main/res/layout/item_level_3.xml @@ -1,46 +1,33 @@ - + - + - - - - - - - - - - - - \ No newline at end of file + android:padding="8dp" + android:text="@{node.value}" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/expand_icon" + app:layout_constraintTop_toTopOf="parent" + app:layout_goneMarginStart="96dp" + tools:text="@tools:sample/full_names" /> +