Skip to content

Commit b948884

Browse files
authored
Merge pull request #1 from filipkowicz/data_binding_view_holders
DataBinding version
2 parents e6a48a3 + e79feb7 commit b948884

File tree

22 files changed

+239
-47
lines changed

22 files changed

+239
-47
lines changed

.gitmodules

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
[submodule "app/src/main/java/headerGist"]
2-
path = app/src/main/java/headerGist
2+
path = headeritemdecorator/src/main/java/com/filipkowicz/headeritemdecorator/headerGist
33
url = [email protected]:1a769001fae407b8813ab4387c42fcbd.git

app/build.gradle

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ apply plugin: 'com.android.application'
22

33
apply plugin: 'kotlin-android'
44

5+
apply plugin: 'kotlin-kapt'
6+
57
apply plugin: 'kotlin-android-extensions'
68

79
android {
@@ -21,12 +23,17 @@ android {
2123
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
2224
}
2325
}
26+
dataBinding {
27+
enabled = true
28+
}
29+
2430
}
2531

2632
dependencies {
2733
implementation fileTree(dir: 'libs', include: ['*.jar'])
34+
implementation project(":headeritemdecorator")
2835
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
29-
implementation 'androidx.appcompat:appcompat:1.0.2'
36+
implementation 'androidx.appcompat:appcompat:1.1.0'
3037
implementation 'androidx.core:core-ktx:1.1.0'
3138
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
3239
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
@@ -35,5 +42,5 @@ dependencies {
3542
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
3643
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
3744

38-
implementation "androidx.recyclerview:recyclerview:1.0.0"
45+
implementation "androidx.recyclerview:recyclerview:1.1.0"
3946
}

app/src/main/java/com/filipkowicz/examples/MainActivity.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package com.filipkowicz.examples
22

3-
import androidx.appcompat.app.AppCompatActivity
43
import android.os.Bundle
4+
import android.view.WindowManager
5+
import androidx.appcompat.app.AppCompatActivity
56
import com.filipkowicz.examples.ui.main.MainFragment
67

78
class MainActivity : AppCompatActivity() {
89

910
override fun onCreate(savedInstanceState: Bundle?) {
1011
super.onCreate(savedInstanceState)
12+
window.setFlags(
13+
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
14+
WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
15+
)
1116
setContentView(R.layout.main_activity)
1217
if (savedInstanceState == null) {
1318
supportFragmentManager.beginTransaction()

app/src/main/java/com/filipkowicz/examples/ui/main/Adapter.kt

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,17 @@ package com.filipkowicz.examples.ui.main
33
import android.annotation.SuppressLint
44
import android.view.LayoutInflater
55
import android.view.ViewGroup
6-
import android.widget.TextView
6+
import androidx.databinding.ViewDataBinding
77
import androidx.recyclerview.widget.DiffUtil
88
import androidx.recyclerview.widget.ListAdapter
99
import androidx.recyclerview.widget.RecyclerView
10+
import com.filipkowicz.examples.BR
1011
import com.filipkowicz.examples.R
12+
import com.filipkowicz.examples.databinding.HeaderLayoutBinding
13+
import com.filipkowicz.examples.databinding.ItemLayoutBinding
1114

1215
class Adapter
13-
: ListAdapter<ListItem, RecyclerView.ViewHolder>(object : DiffUtil.ItemCallback<ListItem>() {
16+
: ListAdapter<ListItem, DataBindingViewHolder>(object : DiffUtil.ItemCallback<ListItem>() {
1417
override fun areItemsTheSame(oldItem: ListItem, newItem: ListItem): Boolean {
1518
return oldItem.itemType == newItem.itemType
1619
}
@@ -21,29 +24,30 @@ class Adapter
2124
}
2225
}) {
2326

24-
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder =
27+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DataBindingViewHolder =
2528
when (viewType) {
26-
R.layout.item_layout -> LayoutInflater.from(parent.context).inflate(
27-
viewType,
28-
parent,
29-
false
30-
)
31-
R.layout.header_layout -> LayoutInflater.from(parent.context).inflate(
32-
viewType,
33-
parent,
34-
false
35-
)
29+
R.layout.item_layout -> HeaderLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
30+
R.layout.header_layout -> ItemLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
3631
else -> throw IllegalArgumentException("no supported item id")
3732
}.let {
38-
object : RecyclerView.ViewHolder(it) {}
33+
DataBindingViewHolder(it)
3934
}
4035

4136

42-
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
43-
(holder.itemView as? TextView)?.text = (getItem(position) as? MainViewModel.Data)?.data
37+
override fun onBindViewHolder(holder: DataBindingViewHolder, position: Int) {
38+
holder.bind(getItem(position) as MainViewModel.Data)
4439
}
4540

4641
override fun getItemViewType(position: Int): Int {
4742
return getItem(position).itemType
4843
}
44+
}
45+
46+
class DataBindingViewHolder(private val binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) {
47+
48+
fun bind(item: MainViewModel.Data) {
49+
binding.setVariable(BR.data, item.data)
50+
binding.executePendingBindings()
51+
}
52+
4953
}

app/src/main/java/com/filipkowicz/examples/ui/main/MainFragment.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package com.filipkowicz.examples.ui.main
22

3-
import HeaderItemDecoration
4-
import androidx.lifecycle.ViewModelProviders
53
import android.os.Bundle
6-
import androidx.fragment.app.Fragment
74
import android.view.LayoutInflater
85
import android.view.View
96
import android.view.ViewGroup
7+
import androidx.fragment.app.Fragment
108
import androidx.lifecycle.Observer
9+
import androidx.lifecycle.ViewModelProviders
1110
import androidx.recyclerview.widget.RecyclerView
1211
import com.filipkowicz.examples.R
12+
import com.filipkowicz.headeritemdecorator.HeaderItemDecoration
1313

1414
class MainFragment : Fragment() {
1515

@@ -26,7 +26,9 @@ class MainFragment : Fragment() {
2626
return inflater.inflate(R.layout.main_fragment, container, false).also {
2727
it.findViewById<RecyclerView>(R.id.recycler).apply {
2828
adapter = this@MainFragment.adapter
29-
addItemDecoration(HeaderItemDecoration(this) {
29+
addItemDecoration(HeaderItemDecoration(this,
30+
shouldFadeOutHeader = true
31+
) {
3032
this@MainFragment.adapter.getItemViewType(it) == R.layout.header_layout
3133
})
3234
}

app/src/main/java/com/filipkowicz/examples/ui/main/MainViewModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class MainViewModel : ViewModel() {
99

1010
val items: LiveData<List<ListItem>> = MutableLiveData(
1111
listOf(
12+
Data(R.layout.header_layout, "HEADER 0"),
1213
Data(R.layout.item_layout, "item 1"),
1314
Data(R.layout.item_layout, "item 2"),
1415
Data(R.layout.header_layout, "HEADER 1"),

app/src/main/java/headerGist

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

3-
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
4-
android:id="@+id/textView"
5-
android:layout_width="match_parent"
6-
android:layout_height="102dp"
7-
android:gravity="center"
8-
android:background="@color/colorAccent"
9-
style="@style/TextAppearance.AppCompat.Headline"
10-
android:text="Header" />
3+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:tools="http://schemas.android.com/tools">
5+
6+
<data>
7+
8+
<variable
9+
name="data"
10+
type="String" />
11+
12+
</data>
13+
14+
<TextView
15+
android:id="@+id/textView"
16+
style="@style/TextAppearance.AppCompat.Headline"
17+
android:layout_width="match_parent"
18+
android:layout_height="102dp"
19+
android:background="@color/colorAccent"
20+
android:gravity="center"
21+
android:text="@{data}"
22+
tools:text="header" />
23+
</layout>
Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
<?xml version="1.0" encoding="utf-8"?>
22

3-
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
4-
android:id="@+id/textView"
5-
android:layout_width="match_parent"
6-
android:layout_height="80dp"
7-
android:gravity="center"
8-
android:background="@color/colorPrimary"
9-
style="@style/TextAppearance.AppCompat.Display3"
10-
android:text="Item" />
3+
<layout xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:tools="http://schemas.android.com/tools">
5+
6+
<data>
7+
8+
<variable
9+
name="data"
10+
type="String" />
11+
12+
</data>
13+
14+
<TextView
15+
android:id="@+id/textView"
16+
style="@style/TextAppearance.AppCompat.Display3"
17+
android:layout_width="match_parent"
18+
android:layout_height="80dp"
19+
android:background="@color/colorPrimary"
20+
android:gravity="center"
21+
android:text="@{data}"
22+
tools:text="item" />
23+
</layout>

app/src/main/res/layout/main_fragment.xml

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,29 @@
55
android:id="@+id/main"
66
android:layout_width="match_parent"
77
android:layout_height="match_parent"
8+
android:background="#ff00ff"
89
tools:context=".ui.main.MainFragment">
910

1011
<androidx.recyclerview.widget.RecyclerView
1112
android:id="@+id/recycler"
1213
android:layout_width="0dp"
1314
android:layout_height="0dp"
14-
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
15+
android:clipToPadding="false"
1516
android:orientation="vertical"
16-
app:layout_constraintTop_toTopOf="parent"
17+
android:paddingTop="150dp"
18+
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
1719
app:layout_constraintBottom_toBottomOf="parent"
1820
app:layout_constraintLeft_toLeftOf="parent"
19-
app:layout_constraintRight_toRightOf="parent"/>
21+
app:layout_constraintRight_toRightOf="parent"
22+
app:layout_constraintTop_toTopOf="parent" />
23+
24+
<androidx.appcompat.widget.Toolbar
25+
android:layout_width="match_parent"
26+
android:layout_height="150dp"
27+
android:background="#aaffffff"
28+
app:layout_constraintLeft_toLeftOf="parent"
29+
app:layout_constraintRight_toRightOf="parent"
30+
app:layout_constraintTop_toTopOf="parent"
31+
app:title="@string/app_name"/>
32+
2033
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)