У меня есть AllMoviesActivity
и два фрагмента. Первый - MovieFragment
, а другой - UpdateMovieFragment
.
Я показываю все фильмы в формате RecyclerView
в MovieFragment
. Структура Movie
модели класса:
class Movie() : Parcelable {
var movieID: String? = ""
var movieName: String? = ""
var movieImage: Uri? = null
...
}
Всякий раз, когда я нажимаю ImageView
элемента Movie
в RecyclerView
, он переходит к UpdateMovieFragment
, где я выбираю изображение для фильма и вводю название фильма. Я делаю переход от MovieFragment
до UpdateMovieFragment
из класса MovieAdapter
, устанавливая Предмет Фильма как Аргумент Фрагмента.
val fragment = UpdateMovieFragment()
val bundle = Bundle()
bundle.putParcelable("movie", allMovies[p1])
fragment.arguments = bundle
val transaction = (activity as FragmentActivity).supportFragmentManager.beginTransaction()
transaction.addToBackStack(null)
transaction.replace(R.id.frame_layout, fragment).commit()
Теперь я устанавливаю текущее время как MovieID
для каждого фильма, чтобы сохранить его уникальность, чтобы я мог обновить этот конкретный элемент фильма на RecyclerView
Позже.
Теперь я использую кнопку меню в упражнении для операции отправки обоих фрагментов. При каждом нажатии кнопки отправки я проверяю, какой фрагмент отображается на дисплее. Если это UpdateMovieFragment, то моя цель - вернуть обновленный фильм в MovieFragment.
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
return when (item.itemId) {
R.id.action_save -> {
val fragment = supportFragmentManager.findFragmentById(R.id.list_fragment_container)
when (fragment) {
is UpdateMovieFragment -> {
supportFragmentManager.popBackStack()
val fragmentNew = supportFragmentManager.findFragmentByTag("LIST")
if (fragmentNew is MovieFragment) {
fragmentNew.refreshMovies(fragment.movie)
} else {
CommonMethods().showToast(applicationContext, "UpdateMovieFragment")
}
}
is MovieFragment -> {
CommonMethods().showToast(applicationContext, "Do nothing for now")
}
}
true
}
else -> super.onOptionsItemSelected(item)
}
}
Здесь я не получаю обновленный фильм в MovieFragment
. Для метода refreshMovies
я делаю это:
fun refreshMovies(movie: Movie) {
for (i in 0 until movieItems.size) {
val secondItem = movieItems[i]
if (movie.movieID == secondItem.movieID) {
rankItems[i] = rankItem
break
}
}
itemAdapter.notifyDataSetChanged()
}
Как лучше всего это решить?