在我的應用程式中,我使用NavigationComponent
了 showFragments
并且使用了ViewModel
!
但是旋轉螢屏重新創建片段并洗掉所有位置,再次呼叫 api 等等......
我的片段代碼:
@AndroidEntryPoint
class HomeFragment : Fragment() {
//Binding
private lateinit var binding: FragmentHomeBinding
@Inject
lateinit var genreAdapter: GenreAdapter
@Inject
lateinit var topMoviesAdapter: TopMoviesAdapter
private val viewModel: HomeViewModel by viewModels()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
binding = FragmentHomeBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//InitViews
binding.apply {
//Genres
viewModel.genresList.observe(viewLifecycleOwner) {
genreAdapter.differ.submitList(it)
genresRecycler.initRecycler(
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false),
genreAdapter
)
}
viewModel.loadGenresList()
//Top movies
viewModel.topMoviesList.observe(viewLifecycleOwner) {
topMoviesAdapter.differ.submitList(it.data)
topMoviesRecycler.initRecycler(
LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false),
topMoviesAdapter
)
topMoviesRecycler.smoothScrollToPosition(4)
}
viewModel.loadTopMoviesList(1)
//Loading
viewModel.loading.observe(viewLifecycleOwner) {
if (it) {
homeLoading.showInvisible(true)
} else {
homeLoading.showInvisible(false)
}
}
}
}
}
視圖模型代碼:
@HiltViewModel
class HomeViewModel @Inject constructor(private val repository: HomeRepository) : ViewModel() {
val genresList = MutableLiveData<List<ResponseGenres.ResponseGenresItem>>()
val topMoviesList = MutableLiveData<ResponseMovies>()
val loading = MutableLiveData<Boolean>()
fun loadGenresList() = viewModelScope.launch {
val response = repository.genresList()
if (response.isSuccessful) {
genresList.postValue(response.body())
}
}
fun loadTopMoviesList(id: Int) = viewModelScope.launch {
loading.postValue(true)
val response = repository.topMoviesList(id)
if (response.isSuccessful) {
topMoviesList.postValue(response.body())
}
loading.postValue(false)
}
}
如何修復它并禁用重新創建片段?
uj5u.com熱心網友回復:
我建議避免重新呼叫 API,但從來沒有考慮禁用在片段中重新創建片段,因為這是一個 Android 架構。
簡單地說,覆寫onCreate()
Fragment 中的方法,并將呼叫 API 邏輯移至它。
viewModel.loadGenresList()
這將呼叫一次,因為onCreate()
即使在螢屏旋轉后也只創建一次
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/441748.html
上一篇:如何根據另一列中的條件創建新列