diff --git a/app/build.gradle b/app/build.gradle index 99f795a..884df73 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -32,6 +32,7 @@ implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' + implementation 'com.android.support:support-v4:26.1.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' diff --git a/app/src/main/java/keijumt/todoapp/di/ActivityModule.kt b/app/src/main/java/keijumt/todoapp/di/ActivityModule.kt index ccdb04f..57179f2 100644 --- a/app/src/main/java/keijumt/todoapp/di/ActivityModule.kt +++ b/app/src/main/java/keijumt/todoapp/di/ActivityModule.kt @@ -11,7 +11,7 @@ @Module internal abstract class ActivityModule { - @ContributesAndroidInjector + @ContributesAndroidInjector(modules = arrayOf(FragmentBuildersModule::class)) internal abstract fun contributeMainActivity(): MainActivity @ContributesAndroidInjector(modules = arrayOf(FragmentBuildersModule::class)) diff --git a/app/src/main/java/keijumt/todoapp/di/FragmentBuildersModule.kt b/app/src/main/java/keijumt/todoapp/di/FragmentBuildersModule.kt index b62d67a..1eddd96 100644 --- a/app/src/main/java/keijumt/todoapp/di/FragmentBuildersModule.kt +++ b/app/src/main/java/keijumt/todoapp/di/FragmentBuildersModule.kt @@ -3,6 +3,7 @@ import dagger.Module import dagger.android.ContributesAndroidInjector import keijumt.todoapp.addtask.AddEditTaskFragment +import keijumt.todoapp.main.TasksFragment /** * DIするFragment @@ -11,4 +12,7 @@ abstract class FragmentBuildersModule { @ContributesAndroidInjector abstract fun contributeAddEditTaskFragment(): AddEditTaskFragment + + @ContributesAndroidInjector + abstract fun contributeTasksFragment(): TasksFragment } \ No newline at end of file diff --git a/app/src/main/java/keijumt/todoapp/di/ViewModelModule.kt b/app/src/main/java/keijumt/todoapp/di/ViewModelModule.kt index a6413ba..8ce3e6c 100644 --- a/app/src/main/java/keijumt/todoapp/di/ViewModelModule.kt +++ b/app/src/main/java/keijumt/todoapp/di/ViewModelModule.kt @@ -7,6 +7,7 @@ import dagger.multibindings.IntoMap import keijumt.todoapp.addtask.AddEditTaskViewModel import keijumt.todoapp.main.MainViewModel +import keijumt.todoapp.main.TasksViewModel /** * DIするViewModel @@ -24,6 +25,11 @@ @ViewModelKey(AddEditTaskViewModel::class) internal abstract fun bindAddTaskViewModel(addTaskViewModel: AddEditTaskViewModel): ViewModel + @Binds + @IntoMap + @ViewModelKey(TasksViewModel::class) + internal abstract fun bindTasksViewModel(tasksViewModel: TasksViewModel): ViewModel + @Binds internal abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory diff --git a/app/src/main/java/keijumt/todoapp/main/TasksAdapter.kt b/app/src/main/java/keijumt/todoapp/main/TasksAdapter.kt new file mode 100644 index 0000000..62a6af4 --- /dev/null +++ b/app/src/main/java/keijumt/todoapp/main/TasksAdapter.kt @@ -0,0 +1,46 @@ +package keijumt.todoapp.main + +import android.content.Context +import android.databinding.DataBindingUtil +import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater +import android.view.ViewGroup +import keijumt.todoapp.R +import keijumt.todoapp.data.db.entity.Task +import keijumt.todoapp.databinding.ItemTaskBinding + +/** + * Created by matsumoto_k on 2018/03/09. + */ +class TasksAdapter(val context: Context, val items: ArrayList) : RecyclerView.Adapter() { + override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { + val binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_task, parent, false) + return ViewHolder(binding) + } + + override fun onBindViewHolder(holder: ViewHolder?, position: Int) { + holder?.binding?.task = items.get(position) + } + + override fun getItemCount(): Int { + return items.count() + } + + fun setItemAndRefresh(items: List) { + this.items.clear() + this.items.addAll(items) + notifyDataSetChanged() + } + + fun insert(item: Task) { + items.add(item) + notifyItemInserted(itemCount) + } + + fun remove(position: Int) { + items.removeAt(position) + notifyItemRemoved(position) + } + + inner class ViewHolder(val binding: ItemTaskBinding) : RecyclerView.ViewHolder(binding.root) +} \ No newline at end of file diff --git a/app/src/main/java/keijumt/todoapp/main/TasksFragment.kt b/app/src/main/java/keijumt/todoapp/main/TasksFragment.kt new file mode 100644 index 0000000..870803d --- /dev/null +++ b/app/src/main/java/keijumt/todoapp/main/TasksFragment.kt @@ -0,0 +1,60 @@ +package keijumt.todoapp.main + + +import android.arch.lifecycle.Observer +import android.arch.lifecycle.ViewModelProviders +import android.databinding.DataBindingUtil +import android.os.Bundle +import android.support.v4.app.Fragment +import android.support.v7.widget.LinearLayoutManager +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup + +import keijumt.todoapp.R +import keijumt.todoapp.databinding.FragmentTasksBinding +import keijumt.todoapp.di.Injectable +import keijumt.todoapp.di.ViewModelFactory +import javax.inject.Inject + + +class TasksFragment : Fragment(), Injectable { + + @Inject + lateinit var viewModelFactory: ViewModelFactory + lateinit var binding: FragmentTasksBinding + lateinit var tasksViewModel: TasksViewModel + lateinit var adapter: TasksAdapter + + override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_tasks, null, false) + tasksViewModel = ViewModelProviders.of(activity, viewModelFactory).get(TasksViewModel::class.java) + binding.tasksViewModel = tasksViewModel + lifecycle.addObserver(tasksViewModel) + return binding.root + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + + setupRecyclerView() + subscribe() + } + + private fun setupRecyclerView() { + adapter = TasksAdapter(activity, arrayListOf()) + binding.recyclerTasks.apply { + adapter = this@TasksFragment.adapter + layoutManager = LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false) + } + + } + + fun subscribe() { + tasksViewModel.tasks.observe(this, Observer { + this.adapter.setItemAndRefresh(it ?: arrayListOf()) + }) + } + +} diff --git a/app/src/main/java/keijumt/todoapp/main/TasksViewModel.kt b/app/src/main/java/keijumt/todoapp/main/TasksViewModel.kt new file mode 100644 index 0000000..725eb43 --- /dev/null +++ b/app/src/main/java/keijumt/todoapp/main/TasksViewModel.kt @@ -0,0 +1,20 @@ +package keijumt.todoapp.main + +import android.arch.lifecycle.LiveData +import keijumt.todoapp.BaseViewModel +import keijumt.todoapp.data.db.entity.Task +import keijumt.todoapp.data.repository.TaskRepository +import keijumt.todoapp.util.toLiveData +import javax.inject.Inject + +/** + * Task一覧のViewModel + * Created by matsumoto_k on 2018/03/09. + */ +class TasksViewModel @Inject constructor( + val repository: TaskRepository +) : BaseViewModel() { + val tasks: LiveData> by lazy { + repository.tasks.toLiveData() + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index ba87699..9c97960 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -13,6 +13,12 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_task.xml b/app/src/main/res/layout/item_task.xml new file mode 100644 index 0000000..8f5794f --- /dev/null +++ b/app/src/main/res/layout/item_task.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d155284..5e89be2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -2,4 +2,7 @@ ToDoApp Task title Task details + + + Hello blank fragment