Skip to content

Commit f854ad4

Browse files
Add LiveData and ViewModel to fragments
1 parent 128d052 commit f854ad4

16 files changed

+359
-193
lines changed

app/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ dependencies {
4545
implementation("com.google.android.material:material:1.3.0-alpha01")
4646
implementation("com.apollographql.apollo:apollo-runtime:2.2.2")
4747
implementation("com.apollographql.apollo:apollo-coroutines-support:2.2.2")
48+
implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.2.0")
49+
4850
}
4951

5052
apollo {

app/src/main/java/guide/graphql/toc/ChaptersFragment.kt

Lines changed: 0 additions & 80 deletions
This file was deleted.

app/src/main/java/guide/graphql/toc/MainActivity.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,30 @@ package guide.graphql.toc
22

33
import android.os.Bundle
44
import androidx.appcompat.app.AppCompatActivity
5+
import androidx.navigation.NavController
6+
import androidx.navigation.findNavController
57

68
class MainActivity : AppCompatActivity() {
79

10+
private val navigationListener = NavController.OnDestinationChangedListener { controller, destination, arguments ->
11+
if (destination.id == R.id.chapters_fragment) {
12+
this.setTitle(R.string.app_name)
13+
}
14+
}
15+
816
override fun onCreate(savedInstanceState: Bundle?) {
917
super.onCreate(savedInstanceState)
1018

1119
setContentView(R.layout.activity_main)
1220
}
21+
22+
override fun onResume() {
23+
super.onResume()
24+
findNavController(R.id.nav_host_fragment).addOnDestinationChangedListener(navigationListener)
25+
}
26+
27+
override fun onPause() {
28+
super.onPause()
29+
findNavController(R.id.nav_host_fragment).removeOnDestinationChangedListener(navigationListener)
30+
}
1331
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package guide.graphql.toc
2+
3+
//https://github.com/android/architecture-components-samples/blob/master/GithubBrowserSample/app/src/main/java/com/android/example/github/vo/Resource.kt
4+
5+
data class Resource<out T>(val status: Status, val data: T?, val message: String?) {
6+
companion object {
7+
fun <T> success(data: T?): Resource<T> {
8+
return Resource(Status.SUCCESS, data, null)
9+
}
10+
11+
fun <T> error(msg: String, data: T?): Resource<T> {
12+
return Resource(Status.ERROR, data, msg)
13+
}
14+
15+
fun <T> loading(data: T?): Resource<T> {
16+
return Resource(Status.LOADING, data, null)
17+
}
18+
}
19+
}
20+
enum class Status {
21+
SUCCESS,
22+
ERROR,
23+
LOADING
24+
}

app/src/main/java/guide/graphql/toc/SectionsFragment.kt

Lines changed: 0 additions & 103 deletions
This file was deleted.

app/src/main/java/guide/graphql/toc/ChaptersAdapter.kt renamed to app/src/main/java/guide/graphql/toc/ui/chapters/ChaptersAdapter.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
1-
package guide.graphql.toc
1+
package guide.graphql.toc.ui.chapters
22

33
import android.content.Context
44
import android.view.LayoutInflater
55
import android.view.View
66
import android.view.ViewGroup
77
import androidx.recyclerview.widget.RecyclerView
8+
import guide.graphql.toc.ChaptersQuery
9+
import guide.graphql.toc.R
810
import guide.graphql.toc.databinding.ChapterBinding
911

1012
class ChaptersAdapter(
11-
private val chapters: List<ChaptersQuery.Chapter>,
13+
private var chapters: List<ChaptersQuery.Chapter>,
1214
private val context: Context,
1315
private val onItemClicked: ((ChaptersQuery.Chapter) -> Unit)
1416
) :
1517
RecyclerView.Adapter<ChaptersAdapter.ViewHolder>() {
1618

1719
class ViewHolder(val binding: ChapterBinding) : RecyclerView.ViewHolder(binding.root)
1820

21+
fun updateChapters(chapters: List<ChaptersQuery.Chapter>) {
22+
this.chapters = chapters
23+
notifyDataSetChanged()
24+
}
25+
1926
override fun getItemCount(): Int {
2027
return chapters.size
2128
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package guide.graphql.toc.ui.chapters
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import android.widget.Toast
8+
import androidx.appcompat.app.AppCompatActivity
9+
import androidx.fragment.app.Fragment
10+
import androidx.fragment.app.viewModels
11+
import androidx.lifecycle.Observer
12+
import androidx.navigation.fragment.findNavController
13+
import androidx.recyclerview.widget.DividerItemDecoration
14+
import androidx.recyclerview.widget.LinearLayoutManager
15+
import com.google.android.material.transition.MaterialFade
16+
import guide.graphql.toc.Status
17+
import guide.graphql.toc.databinding.ChaptersFragmentBinding
18+
19+
class ChaptersFragment : Fragment() {
20+
21+
private val viewModel: ChaptersViewModel by viewModels()
22+
23+
private lateinit var binding: ChaptersFragmentBinding
24+
25+
override fun onCreateView(
26+
inflater: LayoutInflater,
27+
container: ViewGroup?,
28+
savedInstanceState: Bundle?
29+
): View? {
30+
binding = ChaptersFragmentBinding.inflate(inflater)
31+
return binding.root
32+
}
33+
34+
override fun onCreate(savedInstanceState: Bundle?) {
35+
super.onCreate(savedInstanceState)
36+
val materialFade = MaterialFade()
37+
exitTransition = materialFade
38+
39+
}
40+
41+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
42+
super.onViewCreated(view, savedInstanceState)
43+
44+
(requireActivity() as AppCompatActivity).setSupportActionBar(binding.bookHeader)
45+
46+
val adapter =
47+
ChaptersAdapter(
48+
listOf(),
49+
requireContext()
50+
) { chapter ->
51+
findNavController().navigate(
52+
ChaptersFragmentDirections.viewSections(
53+
chapterId = chapter.id,
54+
chapterNumber = chapter.number?.toInt() ?: -1,
55+
chapterTitle = chapter.title
56+
)
57+
)
58+
}
59+
val layoutManager = LinearLayoutManager(requireContext())
60+
binding.chapters.layoutManager = layoutManager
61+
val itemDivider = DividerItemDecoration(requireContext(), layoutManager.orientation)
62+
binding.chapters.addItemDecoration(itemDivider)
63+
binding.chapters.adapter = adapter
64+
65+
viewModel.chapterList.observe(viewLifecycleOwner, Observer { chapterListResponse ->
66+
when (chapterListResponse.status) {
67+
Status.SUCCESS -> {
68+
chapterListResponse.data?.let {
69+
adapter.updateChapters(it)
70+
}
71+
}
72+
Status.ERROR -> Toast.makeText(requireContext(), "Error: ${chapterListResponse.message}", Toast.LENGTH_SHORT).show()
73+
}
74+
})
75+
76+
}
77+
}

0 commit comments

Comments
 (0)