'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