RecyclerView在屏幕旋转时重新创建



`

class MoviesFragment : Fragment() {
private var viewModel: MoviesViewModel? = null
private var adapter = MoviesAdapter()
private lateinit var binding : FragmentMoviesBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentMoviesBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
recyclerViewInit()
viewModelInit()
}
private fun recyclerViewInit() {
val recyclerView = binding.recyclerView
recyclerView.adapter = adapter
recycler_view.layoutManager = LinearLayoutManager(requireContext())
}
private fun viewModelInit() {
viewModel = ViewModelProvider(this)[MoviesViewModel::class.java]
viewModel!!.getPageOfMovies()
viewModel!!.myResponse.observe(viewLifecycleOwner) { response ->
if (response.isSuccessful) {
response.body()?.let { movies ->
adapter.setData(movies) }
} else {
Toast.makeText(requireContext(), response.code(), Toast.LENGTH_SHORT).show()
}
}
}
}

`

`

class MoviesViewModel(application: Application) : AndroidViewModel(application) {
private val repository = MoviesRepository()
val myResponse: MutableLiveData<Response<MovieResponse>> = MutableLiveData()
fun getPageOfMovies() {
viewModelScope.launch {
val response = repository.getPageOfMovies()
myResponse.value = response
}
}
}

`

`

class MoviesAdapter : RecyclerView.Adapter<MoviesAdapter.ViewHolder>() {
private var moviesList = MovieResponse(0, emptyList(), 0, 0)
inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(parent.context).inflate(
R.layout.movies_recyclerview_item, parent, false
)
)
}
override fun getItemCount(): Int = moviesList.results.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
Glide.with(holder.itemView.context)
.load(Uri.parse("$BASE_URI_FOR_IMAGES${moviesList.results[position].posterPath}"))
.centerCrop()
.into(holder.itemView.poster_imageview)
holder.itemView.title.text = moviesList.results[position].title
holder.itemView.overview.text = moviesList.results[position].overview
holder.itemView.release_date.text = moviesList.results[position].releaseDate
}
@SuppressLint("NotifyDataSetChanged")
fun setData(movies: MovieResponse) {
moviesList = movies
notifyDataSetChanged()
}
companion object{
const val BASE_URI_FOR_IMAGES = "https://www.themoviedb.org/t/p/w220_and_h330_face/"
}
}

`

`

class MoviesRepository {
suspend fun getPageOfMovies(): Response<MovieResponse> {
return MoviesClient.api.getFirstPageOfPopularMovies()
}
}

`

当屏幕在RecyclerView中旋转时,数据会再次加载到新数据的顶部,即列表位于列表的顶部。可能是什么问题?也就是说,我可以滚动和查看我的数据,但在后台我可以看到我的旧列表。

我试图找到在哪里重新创建RecyclerView,但显然一切都应该正常。

默认情况下,屏幕旋转和其他配置更改会重新创建您的活动。重新创建的活动将恢复其片段。只有当活动以新的方式开始并且没有重新创建时,也就是说,savedInstanceState捆绑包为null时,才应该重新添加片段。否则,您将在恢复的片段之上添加一个新片段。

最新更新