'Paging 3 retain scrolling state
I'm using Paging 3 with GitHub API service and represent all public repositories. On repository clicked I open secondd fragment with default android API and pass model into it:
companion object {
@JvmStatic
fun newInstance(repository: RepoModelItem): RepoDetails {
val args = Bundle()
args.putParcelable(Constants.ARG_ID, repository)
val fragment = RepoDetails()
fragment.arguments = args
return fragment
}
}
When I press back button I simply override it like this:
override fun goBack() {
onBackPressed()
}
After that my first fragment resets its position to last item of first API call. It seems like it makes new first call every time. My List fragment:
@AndroidEntryPoint
class RepoList : Fragment(), HasCustomTitle, BaseFragment, OnItemClickCallBack {
private lateinit var binding: FragmentRepoListBinding
private val listAdapter = RepositoriesAdapter(this)
private val viewModel: RepoViewModel by viewModels()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentRepoListBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupRecyclerView()
initViews()
}
override fun getTitle(): Int = R.string.list_of_repositories
override fun initViews() {
viewLifecycleOwner.lifecycleScope.launch {
viewModel.collectRepositories().collectLatest { pagingData ->
listAdapter.submitData(viewLifecycleOwner.lifecycle, pagingData)
}
}
binding.mainSwipeRefresh.setOnRefreshListener {
listAdapter.refresh()
binding.mainSwipeRefresh.isRefreshing = false
}
}
private fun setupRecyclerView() {
val footerAdapter = RepoLoadStateAdapter { listAdapter.retry() }
val adapterWithLoadState = listAdapter.withLoadStateFooter(footerAdapter)
binding.rvRepositories.apply {
adapter = adapterWithLoadState
layoutManager = LinearLayoutManager(context)
}
}
override fun onItemClick(repository: RepoModelItem) {
navigator().detailsScreen(repository)
}
}
And PagingDataAdapter:
interface OnItemClickCallBack {
fun onItemClick(repository: RepoModelItem)
}
class RepositoriesAdapter (
private val onItemClickCallback: OnItemClickCallBack,
) : PagingDataAdapter<RepoModelItem, RepositoriesAdapter.RepoViewHolder>(RepoComparator) {
inner class RepoViewHolder(val binding: RepoListItemBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(repoTuple: RepoModelItem, onItemClickCallback: OnItemClickCallBack) =
with(binding) {
tvUsersName.text = repoTuple.full_name
tvUsersLogin.text = repoTuple.owner?.login
ImageLoader.loadImage(iwUsersAvatar, repoTuple.owner?.avatar_url!!)
itemView.setOnClickListener {
onItemClickCallback.onItemClick(repoTuple)
}
}
}
object RepoComparator : DiffUtil.ItemCallback<RepoModelItem>() {
override fun areItemsTheSame(oldItem: RepoModelItem, newItem: RepoModelItem): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: RepoModelItem, newItem: RepoModelItem): Boolean {
return oldItem == newItem
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RepoViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding = RepoListItemBinding.inflate(inflater, parent, false)
return RepoViewHolder(binding)
}
override fun onBindViewHolder(holder: RepoViewHolder, position: Int) {
getItem(position)?.let { holder.bind(it, onItemClickCallback) }
}
}
Is there any way to save recyclerview's position?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
