Skip to content

Commit

Permalink
- DI 주입 및 ViewModel 구조 구현
Browse files Browse the repository at this point in the history
  • Loading branch information
danggai committed Jan 7, 2021
1 parent e92b7d8 commit 32c9750
Show file tree
Hide file tree
Showing 21 changed files with 354 additions and 257 deletions.
5 changes: 5 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ dependencies {
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'

// Koin - DI
implementation "org.koin:koin-core:2.0.1"
implementation "org.koin:koin-android:2.0.1"
implementation "org.koin:koin-androidx-viewmodel:2.0.1"

// ViewPager2
implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01'

Expand Down
3 changes: 2 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@
package="com.example.recyclerview_sticky_headerfooter_example">

<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Recyclerview_Sticky_HeaderFooter_Example">
<activity
android:name=".MainActivity"
android:name=".ui.main.MainActivity"
android:label="@string/app_name"
android:theme="@style/Theme.Recyclerview_Sticky_HeaderFooter_Example.NoActionBar">
<intent-filter>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.example.recyclerview_sticky_headerfooter_example

import android.app.Application
import com.example.recyclerview_sticky_headerfooter_example.di.ViewModelModule
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin

class App: Application() {

override fun onCreate() {
super.onCreate()
startKoin {
androidLogger()
androidContext(this@App)
modules(ViewModelModule)
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.example.recyclerview_sticky_headerfooter_example

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.annotation.LayoutRes
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding

abstract class BindingActivity<T: ViewDataBinding> : AppCompatActivity() {
@LayoutRes
abstract fun getLayoutResId(): Int

protected lateinit var binding: T
private set

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, getLayoutResId())
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.recyclerview_sticky_headerfooter_example

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding

abstract class BindingFragment<T: ViewDataBinding> : Fragment() {
@LayoutRes
abstract fun getLayoutResId(): Int

protected lateinit var binding: T
private set

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return DataBindingUtil.inflate<T>(inflater, getLayoutResId(), container, false).apply{ binding = this }.root
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.recyclerview_sticky_headerfooter_example.di

import com.example.recyclerview_sticky_headerfooter_example.ui.main.MainTabViewModel
import com.example.recyclerview_sticky_headerfooter_example.ui.main.MainViewModel
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.dsl.module

val ViewModelModule = module {
viewModel { MainViewModel() }
viewModel { MainTabViewModel() }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example.recyclerview_sticky_headerfooter_example.ui.main

import android.os.Bundle
import androidx.annotation.LayoutRes
import com.example.recyclerview_sticky_headerfooter_example.BindingActivity
import com.example.recyclerview_sticky_headerfooter_example.R
import com.example.recyclerview_sticky_headerfooter_example.databinding.ActivityMainBinding
import org.koin.androidx.viewmodel.ext.android.getViewModel

class MainActivity : BindingActivity<ActivityMainBinding>() {

@LayoutRes
override fun getLayoutResId() = R.layout.activity_main

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.lifecycleOwner = this

initFragment()
}

private fun initFragment() {
supportFragmentManager.beginTransaction()
.add(R.id.fragment, MainFragment.newInstance(), MainFragment.TAG)
.commit()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,55 +5,62 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.annotation.LayoutRes
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import androidx.viewpager2.widget.ViewPager2
import com.example.recyclerview_sticky_headerfooter_example.BindingFragment
import com.example.recyclerview_sticky_headerfooter_example.R
import com.example.recyclerview_sticky_headerfooter_example.databinding.FragmentMainBinding
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.snackbar.Snackbar
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import org.koin.androidx.viewmodel.ext.android.getViewModel

/**
* A placeholder fragment containing a simple view.
*/
class MainFragment : Fragment() {
class MainFragment : BindingFragment<FragmentMainBinding>() {

private lateinit var mainViewModel: MainViewModel
companion object {
val TAG: String = MainFragment::class.java.simpleName
fun newInstance() = MainFragment()
}

private lateinit var mVM: MainViewModel

@LayoutRes
override fun getLayoutResId() = R.layout.fragment_main

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.vm = getViewModel()
binding.lifecycleOwner = viewLifecycleOwner

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mainViewModel = ViewModelProvider(this).get(MainViewModel::class.java).apply {
setIndex(arguments?.getInt(ARG_SECTION_NUMBER) ?: 1)
binding.vm?.let {
mVM = it
}
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.fragment_main, container, false)
val textView: TextView = root.findViewById(R.id.section_label)
mainViewModel.text.observe(this, Observer<String> {
textView.text = it
})
return root
initUI()
}

companion object {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private const val ARG_SECTION_NUMBER = "section_number"

/**
* Returns a new instance of this fragment for the given section
* number.
*/
@JvmStatic
fun newInstance(sectionNumber: Int): MainFragment {
return MainFragment().apply {
arguments = Bundle().apply {
putInt(ARG_SECTION_NUMBER, sectionNumber)
}
private fun initUI() {
val sectionsPagerAdapter = MainPager2Adapter()
val viewPager2: ViewPager2 = binding.viewPager2
viewPager2.adapter = sectionsPagerAdapter

val tabs: TabLayout = binding.tabs
TabLayoutMediator(tabs, viewPager2) { tab, position ->
when (position) {
0 -> { tab.text = "TAB 1"}
1 -> { tab.text = "TAB 2"}
2 -> { tab.text = "TAB 3"}
}
viewPager2.setCurrentItem(tab.position, true)
}.attach()

val fab: FloatingActionButton = binding.fab
fab.setOnClickListener { view ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@ import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import com.example.recyclerview_sticky_headerfooter_example.R
import com.example.recyclerview_sticky_headerfooter_example.databinding.FragmentMainTabFirstBinding
import com.example.recyclerview_sticky_headerfooter_example.databinding.FragmentMainTabSecondBinding
import com.example.recyclerview_sticky_headerfooter_example.databinding.FragmentMainTabThirdBinding

public class SectionsPagerAdapter2() : RecyclerView.Adapter<SectionsPagerAdapter2.ItemViewHolder>() {
public class MainPager2Adapter() : RecyclerView.Adapter<MainPager2Adapter.ItemViewHolder>() {

companion object {
const val itemSize = 3
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.example.recyclerview_sticky_headerfooter_example.ui.main

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.example.recyclerview_sticky_headerfooter_example.BindingFragment
import com.example.recyclerview_sticky_headerfooter_example.R
import com.example.recyclerview_sticky_headerfooter_example.databinding.FragmentMainBinding
import com.example.recyclerview_sticky_headerfooter_example.databinding.FragmentMainTabFirstBinding
import org.koin.androidx.viewmodel.ext.android.getViewModel

class MainTabFirstFragment : BindingFragment<FragmentMainTabFirstBinding>() {

companion object {
val TAG: String = MainTabFirstFragment::class.java.simpleName
fun newInstance() = MainTabFirstFragment()
}

private lateinit var mVM: MainTabViewModel

@LayoutRes
override fun getLayoutResId() = R.layout.fragment_main_tab_first

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.vm = getViewModel()
binding.lifecycleOwner = viewLifecycleOwner

binding.vm?.let {
mVM = it
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.example.recyclerview_sticky_headerfooter_example.ui.main

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.example.recyclerview_sticky_headerfooter_example.BindingFragment
import com.example.recyclerview_sticky_headerfooter_example.R
import com.example.recyclerview_sticky_headerfooter_example.databinding.FragmentMainTabFirstBinding
import com.example.recyclerview_sticky_headerfooter_example.databinding.FragmentMainTabSecondBinding
import org.koin.androidx.viewmodel.ext.android.getViewModel

class MainTabSecondFragment : BindingFragment<FragmentMainTabSecondBinding>() {

companion object {
val TAG: String = MainTabSecondFragment::class.java.simpleName
fun newInstance() = MainTabSecondFragment()
}

private lateinit var mVM: MainTabViewModel

@LayoutRes
override fun getLayoutResId() = R.layout.fragment_main_tab_second

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.vm = getViewModel()
binding.lifecycleOwner = viewLifecycleOwner

binding.vm?.let {
mVM = it
}
}
}

0 comments on commit 32c9750

Please sign in to comment.