1 problem. How to save fragments or load them in advance, so that when navigating through navController.navigate() from BottomNavigationView they will be saved somehow.
2 problem. Why data is not passed through onOrderPass. It is not called at all
With ViewPager it was fast, and no problems, but I had to switch to Jetpack Navigation as it would be more appropriate here
Below is the main activity:
class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {
//Variables
override fun onCreate(savedInstanceState: Bundle?) {
WindowCompat.setDecorFitsSystemWindows(window, true)
super.onCreate(savedInstanceState)
b = ActivityMainBinding.inflate(layoutInflater)
makeNavigation()
makeViewModel()
setSupportActionBar(b.appToolBar)
setContentView(b.root)
b.byDataEditedView.setOnClickListener {
chooseSimpleFilter("date_edited")
}
b.byDataAddedView.setOnClickListener {
chooseSimpleFilter("date_added")
}
b.byTitleView.setOnClickListener {
chooseSimpleFilter("title")
}
b.byDescBodyView.setOnClickListener {
chooseSimpleFilter("body")
}
b.byColorCodeView.setOnClickListener {
chooseSimpleFilter("color_code")
}
}
private fun makeNavigation() {
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainer) as NavHostFragment
val navController = navHostFragment.navController
b.navigation.selectedItemId = R.id.homeFragment
b.navigation.setOnItemSelectedListener { id ->
//Some logic for get a filter
changePageSimpleFilter(filter)
return@setOnItemSelectedListener true
}
b.navigation.setupWithNavController(navController)
}
private fun makeViewModel() {
val noteRepository = NoteRepository(LifeDataBase(this))
val viewModelProviderFactory = NoteViewModelProviderFactory(application, noteRepository)
noteViewModel = ViewModelProvider(
this, viewModelProviderFactory
)[NoteViewModel::class.java]
}
private fun showFilter(simpleFilter: Boolean) {
if (simpleFilter) {
b.advancedFilter.visibility = View.GONE
b.simpleFilter.visibility = View.VISIBLE
} else {
b.advancedFilter.visibility = View.VISIBLE
b.simpleFilter.visibility = View.GONE
}
}
private fun changePageSimpleFilter(filter: String) {
//Some logic
orderPass(filter)
}
private fun chooseSimpleFilter(filter: String) {
//Some logic
orderPass(filter)
}
private fun orderPass(filter: String) {
orderPass?.onOrderPassNote(filter)
}
fun setOnOrderPassListener(listener: OrderPass) {
orderPass = listener
}
}
Below is one of the fragments that takes about 4 seconds to load when navigating to it.
class NotesFragment: Fragment(), NoteClick, OrderPass, SearchView.OnQueryTextListener {
private lateinit var b: FragmentNotesBinding
private lateinit var viewModel: NoteViewModel
private lateinit var mAdapter: NoteAdapter
private lateinit var prevTextView: TextView
private lateinit var intent: Intent
private var query: String? = null
private var displayType: DisplayType? = null
private var colorId: Int? = null
private var order: String? = null
private var dayOfWeekS: String? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
b = FragmentNotesBinding.inflate(layoutInflater, container, false)
return b.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel = (activity as MainActivity).noteViewModel
setUpRecyclerView()
setToolbar()
//A little logic, not important
(activity as MainActivity).setOnOrderPassListener(this)
}
private fun setUpRecyclerView() {
mAdapter = NoteAdapter(this)
b.recyclerView.apply {
layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
setHasFixedSize(true)
adapter = mAdapter
}
}
private fun setToolbar() {
val menuHost: MenuHost = requireActivity()
menuHost.addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
menuInflater.inflate(R.menu.search_menu, menu)
val searchItem = menu.findItem(R.id.search_item)
val mMenuSearch = searchItem.actionView as SearchView
mMenuSearch.isSubmitButtonEnabled = false
mMenuSearch.setOnQueryTextListener(this@NotesFragment)
}
override fun onMenuItemSelected(menuItem: MenuItem): Boolean {
return false
}
}, viewLifecycleOwner, Lifecycle.State.RESUMED)
}
private fun updateViewModel() {
val sortQuery = """SELECT * FROM NOTES WHERE
(:query IS NULL OR title LIKE :query OR body LIKE :query)
ORDER BY $order"""
viewModel.getNotes(SimpleSQLiteQuery(
sortQuery,
arrayOf(query)
)).observe(viewLifecycleOwner) { notes ->
mAdapter.differ.submitList(notes)
}
}
override fun onQueryTextSubmit(query: String): Boolean {
return false
}
override fun onQueryTextChange(newText: String): Boolean {
query = "%$newText%"
if (query == "%%") query = null
updateViewModel()
return true
}
override fun onOrderPassNote(data: String) {
order = data
updateViewModel()
}
}
For some reason I have not found an answer that satisfies me, I’m sure there are solutions, but I probably didn’t understand it or didn’t search well enough, even though it took a long time