Archived
Updated EventPageFragment.kt to have access to its own ViewModel and, by extension, its own reference to the database, which forgoes the need to transport data from EventFragment.kt through StudIPEventPageAdapter.kt to EventPageFragment.kt and allows for filtering for a specific day's items through the database rather than needing to iterate through the list via an extension function manually. Also implemented DiffUtil to perform individual updates rather than calling notifyDataSetChanged() every time a single item has been changed.
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package com.denizk0461.studip.fragment
|
||||
|
||||
import android.os.Bundle
|
||||
import android.os.Parcelable
|
||||
import android.util.Log
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
@@ -9,11 +8,8 @@ import android.view.ViewGroup
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.fragment.app.viewModels
|
||||
import com.denizk0461.studip.R
|
||||
import com.denizk0461.studip.adapter.StudIPEventItemAdapter
|
||||
import com.denizk0461.studip.adapter.StudIPEventPageAdapter
|
||||
import com.denizk0461.studip.databinding.FragmentEventBinding
|
||||
import com.denizk0461.studip.model.StudIPEvent
|
||||
import com.denizk0461.studip.sheet.ScheduleUpdateSheet
|
||||
import com.denizk0461.studip.viewmodel.EventViewModel
|
||||
import com.google.android.material.tabs.TabLayoutMediator
|
||||
import java.util.*
|
||||
@@ -73,24 +69,7 @@ class EventFragment : AppFragment() {
|
||||
}
|
||||
|
||||
// Set up the view pager's adapter
|
||||
viewPagerAdapter =
|
||||
StudIPEventPageAdapter(activity as FragmentActivity, listOf(), object : StudIPEventItemAdapter.OnClickListener {
|
||||
override fun onClick(event: StudIPEvent) {
|
||||
// TODO implement functionality or delete
|
||||
}
|
||||
override fun onLongClick(event: StudIPEvent): Boolean {
|
||||
// Save the current page of the ViewPager
|
||||
viewPagerPosition = binding.viewPager.currentItem
|
||||
|
||||
// Open a bottom sheet to edit the event
|
||||
openBottomSheet(ScheduleUpdateSheet(event, onUpdate = { eventToUpdate ->
|
||||
viewModel.update(eventToUpdate)
|
||||
}, onDelete = { eventToDelete ->
|
||||
viewModel.delete(eventToDelete)
|
||||
}))
|
||||
return true
|
||||
}
|
||||
})
|
||||
viewPagerAdapter = StudIPEventPageAdapter(activity as FragmentActivity)
|
||||
|
||||
// Assign the adapter to the view pager
|
||||
binding.viewPager.adapter = viewPagerAdapter
|
||||
@@ -101,25 +80,25 @@ class EventFragment : AppFragment() {
|
||||
}.attach()
|
||||
|
||||
// Set up LiveData observer to refresh the view on update
|
||||
viewModel.allEvents.observe(viewLifecycleOwner) { events ->
|
||||
|
||||
Log.d("AAAbA?", events.toString())
|
||||
|
||||
// Update the item list in the view pager's adapter
|
||||
viewPagerAdapter.setNewItems(events)
|
||||
|
||||
if (!hasFragmentStarted) {
|
||||
// Scroll to the current day, if no page has been stored to be scrolled to
|
||||
switchToCurrentDayView()
|
||||
hasFragmentStarted = true
|
||||
// } else {
|
||||
// /*
|
||||
// * If a page was previously saved, scroll to that one instead. This is meant to
|
||||
// * prevent jumping from
|
||||
// */
|
||||
// binding.viewPager.currentItem = viewPagerPosition
|
||||
}
|
||||
}
|
||||
// viewModel.allEvents.observe(viewLifecycleOwner) { events ->
|
||||
//
|
||||
// Log.d("AAAbA?", events.toString())
|
||||
//
|
||||
// // Update the item list in the view pager's adapter
|
||||
// viewPagerAdapter.setNewItems(events)
|
||||
//
|
||||
// if (!hasFragmentStarted) {
|
||||
// // Scroll to the current day, if no page has been stored to be scrolled to
|
||||
// switchToCurrentDayView()
|
||||
// hasFragmentStarted = true
|
||||
//// } else {
|
||||
//// /*
|
||||
//// * If a page was previously saved, scroll to that one instead. This is meant to
|
||||
//// * prevent jumping from
|
||||
//// */
|
||||
//// binding.viewPager.currentItem = viewPagerPosition
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
override fun onPause() {
|
||||
|
||||
@@ -4,26 +4,25 @@ import android.os.Bundle
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.fragment.app.viewModels
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import com.denizk0461.studip.adapter.StudIPEventPageAdapter
|
||||
import com.denizk0461.studip.adapter.StudIPEventItemAdapter
|
||||
import com.denizk0461.studip.databinding.RecyclerViewBinding
|
||||
import com.denizk0461.studip.model.StudIPEvent
|
||||
import com.denizk0461.studip.sheet.ScheduleUpdateSheet
|
||||
import com.denizk0461.studip.viewmodel.EventPageViewModel
|
||||
|
||||
/**
|
||||
* Fragment that is instantiated by [StudIPEventPageAdapter] to display individual days' pages and
|
||||
* their events.
|
||||
*
|
||||
* @param events list of all events (still not filtered by day at this point)
|
||||
* @param currentDay current day that is used to show only events of a given day (0 = Monday,
|
||||
* 4 = Friday)
|
||||
* @param onClickListener used for listening to clicks and long presses
|
||||
* @param currentDay current day that is used to show only events of a given day (0 = Monday,
|
||||
* 4 = Friday)
|
||||
*/
|
||||
class EventPageFragment(
|
||||
private val events: List<StudIPEvent>,
|
||||
private val currentDay: Int,
|
||||
private val onClickListener: StudIPEventItemAdapter.OnClickListener,
|
||||
) : AppFragment() {
|
||||
) : AppFragment(), StudIPEventItemAdapter.OnClickListener {
|
||||
|
||||
// Nullable view binding reference
|
||||
private var _binding: RecyclerViewBinding? = null
|
||||
@@ -34,6 +33,14 @@ class EventPageFragment(
|
||||
*/
|
||||
private val binding get() = _binding!!
|
||||
|
||||
// View model reference for providing access to the database
|
||||
private val viewModel: EventPageViewModel by viewModels()
|
||||
|
||||
/**
|
||||
* Adapter that manages the page's items
|
||||
*/
|
||||
private val eventAdapter = StudIPEventItemAdapter(currentDay, this)
|
||||
|
||||
// Instantiate the view binding
|
||||
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
|
||||
_binding = RecyclerViewBinding.inflate(inflater, container, false)
|
||||
@@ -49,12 +56,32 @@ class EventPageFragment(
|
||||
|
||||
/*
|
||||
* Create new adapter for every page. Attribute position denotes day that will be set up
|
||||
* by the newly created adapter (0 = Monday, 4 = Friday)
|
||||
* by the newly created adapter (0 = Monday, 4 = Friday, 6 = Sunday)
|
||||
*/
|
||||
adapter = StudIPEventItemAdapter(events, currentDay, onClickListener) // TODO check if empty
|
||||
adapter = eventAdapter
|
||||
|
||||
// Animate creation of new page
|
||||
scheduleLayoutAnimation()
|
||||
}
|
||||
|
||||
// Set up LiveData observer to refresh the view on update
|
||||
viewModel.getEventsForDay(currentDay).observe(viewLifecycleOwner) { events ->
|
||||
// eventAdapter.setNewItems(events)
|
||||
eventAdapter.setNewData(events)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onClick(event: StudIPEvent) {
|
||||
// TODO implement functionality or delete
|
||||
}
|
||||
|
||||
override fun onLongClick(event: StudIPEvent): Boolean {
|
||||
// Open a bottom sheet to edit the event
|
||||
openBottomSheet(ScheduleUpdateSheet(event, onUpdate = { eventToUpdate ->
|
||||
viewModel.update(eventToUpdate)
|
||||
}, onDelete = { eventToDelete ->
|
||||
viewModel.delete(eventToDelete)
|
||||
}))
|
||||
return true
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user