6: Enhance demo application (#9)

* 6: Use data model instead of String. Remove databinding.

* 6: Use online lib dependency

* 6: Remove CircleCI
This commit is contained in:
Adrian Kuta 2022-11-22 18:51:23 +01:00 committed by Adrian Kuta
parent 104005e976
commit fcc051bd11
8 changed files with 146 additions and 246 deletions

View File

@ -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: /.*/

View File

@ -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'

View File

@ -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<String, ExpandableAdapter.ExpandableViewHolder>() {
ExpandableRecyclerViewAdapter<Region, ExpandableAdapter.ExpandableViewHolder>() {
private var tree: ExpandableTreeNode<String>? = null
private var tree: ExpandableTreeNode<Region>? = null
fun setTree(tree: ExpandableTreeNode<String>) {
fun setTree(tree: ExpandableTreeNode<Region>) {
this.tree = tree
notifyDataSetChanged()
}
override fun getTreeNodes(): ExpandableTreeNode<String> = tree ?: expandableTree("")
override fun getTreeNodes(): ExpandableTreeNode<Region> = 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<String>,
treeNode: ExpandableTreeNode<Region>,
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<String>,
onClickListener: ((ExpandableTreeNode<String>) -> Unit)?
node: ExpandableTreeNode<Region>,
onClickListener: ((ExpandableTreeNode<Region>) -> 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<String>,
onClickListener: ((ExpandableTreeNode<String>) -> Unit)?
node: ExpandableTreeNode<Region>,
onClickListener: ((ExpandableTreeNode<Region>) -> 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<String>,
onClickListener: ((ExpandableTreeNode<String>) -> Unit)?
node: ExpandableTreeNode<Region>,
onClickListener: ((ExpandableTreeNode<Region>) -> 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<String>,
onClickListener: ((ExpandableTreeNode<String>) -> Unit)? = null
node: ExpandableTreeNode<Region>,
onClickListener: ((ExpandableTreeNode<Region>) -> Unit)? = null
)
}

View File

@ -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"))
}
}

View File

@ -0,0 +1,3 @@
package com.github.adriankuta
data class Region(val name: String)

View File

@ -1,44 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<data>
<ImageView
android:id="@+id/expand_icon"
android:layout_width="24dp"
android:layout_height="0dp"
android:scaleType="centerInside"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/textView"
tools:src="@drawable/ic_expand_less_black_24dp"
tools:visibility="visible" />
<variable
name="node"
type="com.github.adriankuta.expandable_recyclerview.ExpandableTreeNode&lt;String>" />
<import type="android.view.View" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:viewBindingIgnore="true">
<ImageView
android:id="@+id/expand_icon"
android:layout_width="24dp"
android:layout_height="0dp"
android:scaleType="centerInside"
android:src="@{node.expanded ? @drawable/ic_expand_more_black_24dp : @drawable/ic_expand_less_black_24dp}"
android:visibility="@{node.children.empty ? View.GONE : View.VISIBLE}"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/textView"
tools:src="@drawable/ic_expand_less_black_24dp" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
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" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
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" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,46 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<data>
<ImageView
android:id="@+id/expand_icon"
android:layout_width="24dp"
android:layout_height="0dp"
android:layout_marginStart="24dp"
android:scaleType="centerInside"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/textView"
tools:src="@drawable/ic_expand_less_black_24dp"
tools:visibility="visible" />
<variable
name="node"
type="com.github.adriankuta.expandable_recyclerview.ExpandableTreeNode&lt;String>" />
<import type="android.view.View" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:viewBindingIgnore="true">
<ImageView
android:id="@+id/expand_icon"
android:layout_width="24dp"
android:layout_height="0dp"
android:layout_marginStart="24dp"
android:scaleType="centerInside"
android:src="@{node.expanded ? @drawable/ic_expand_more_black_24dp : @drawable/ic_expand_less_black_24dp}"
android:visibility="@{node.children.empty ? View.GONE : View.VISIBLE}"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/textView"
tools:src="@drawable/ic_expand_less_black_24dp" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
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" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
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" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,46 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<data>
<ImageView
android:id="@+id/expand_icon"
android:layout_width="24dp"
android:layout_height="0dp"
android:layout_marginStart="48dp"
android:scaleType="centerInside"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/textView"
tools:src="@drawable/ic_expand_less_black_24dp"
tools:visibility="visible"/>
<variable
name="node"
type="com.github.adriankuta.expandable_recyclerview.ExpandableTreeNode&lt;String>" />
<import type="android.view.View" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
tools:viewBindingIgnore="true">
<ImageView
android:id="@+id/expand_icon"
android:layout_width="24dp"
android:layout_height="0dp"
android:layout_marginStart="48dp"
android:scaleType="centerInside"
android:src="@{node.expanded ? @drawable/ic_expand_more_black_24dp : @drawable/ic_expand_less_black_24dp}"
android:visibility="@{node.children.empty ? View.GONE : View.VISIBLE}"
app:layout_constraintBottom_toBottomOf="@id/textView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/textView"
tools:src="@drawable/ic_expand_less_black_24dp" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
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" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
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" />
</androidx.constraintlayout.widget.ConstraintLayout>