Пагинация без библиотек Recycler view Api
Не получается сделать пагинацию, смотрела уже кучу всего( я получаю информацию по запросу:
@GET("/api/character/{id}")
fun getPersonageDetail(@Path("id") id: Int): Observable<Personage>
код ретрофита обычный. код репозитория:
override fun getPersonageDetails(
id: Int,
callback: (result: SuccessDetails<Personage>) -> Unit
) {
restModule.provideRetrofitAndOkHttp(UrlObject.PERSONAGE_LIST_URL).getPersonageDetail(id)
.map {
Personage(
it.personageId,
it.personageImage,
it.personageName,
it.personageSpecies,
it.personageStatus,
it.personageGender,
it.personagePersonageOrigin,
it.personageLocation,
it.personageEpisode
)
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ personage ->
callback(SuccessDetails(personage))
},
{ error -> Log.e("AAA", "${Thread.currentThread().name} Error") }
)
}
viewModel
class EpisodeDetailsViewModel : ViewModel() {
private var myId = 0
private var myRep = RepositoryRetrofitDetails()
private var resultArray = ArrayList<Personage> ()
private var _episodeLiveData = MutableLiveData<Episode>()
private var _personageLiveData = MutableLiveData<ArrayList<Personage>>()
val episodeLiveData: LiveData<Episode> = _episodeLiveData
val personageLiveData: LiveData<ArrayList<Personage>> = _personageLiveData
fun getPersonage(id: Int) {
myRep.getEpisodeDetails(id) { episode ->
val result: Episode = episode.value
_episodeLiveData.value = result
for (i in result.episodeCharacters) {
myId = (i.substring(i.lastIndexOf("/") + 1)).toInt()
myRep.getPersonageDetails(myId) {
resultArray.add(it.value)
_personageLiveData.value = resultArray
}
}
}
}
}
Адаптер:
class PersonageAdapter(
private val onClick: (Int) -> Unit
) : RecyclerView.Adapter<PersonageAdapter.PersonageViewHolder>(){
// lateinit var loadMoreListener: OnLoadMoreListener
var personageList = arrayListOf<Personage>()
set(value) {
field = value
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonageViewHolder =
PersonageViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.personage_list_item, parent, false)
)
override fun onBindViewHolder(holder: PersonageViewHolder, position: Int) {
// if ((position >= itemCount - 1 )){
// loadMoreListener.onLoadMore()
// }
holder.bind(personageList[position])
holder.itemView.setOnClickListener {
onClick(personageList[position].personageId)
}
}
override fun getItemCount(): Int = personageList.size
interface OnLoadMoreListener {
fun onLoadMore()
}
class PersonageViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val personageImage: ImageView = itemView.findViewById(R.id.personageImage)
private val personageName: TextView = itemView.findViewById(R.id.personageName)
private val personageSpecies: TextView = itemView.findViewById(R.id.personageSpecies)
private val personageStatus: TextView = itemView.findViewById(R.id.personageStatus)
private val personageGender: TextView = itemView.findViewById(R.id.personageGender)
fun bind(personage: Personage) {
loadingImage(personage.personageImage, personageImage)
personageName.text = personage.personageName
personageSpecies.text = personage.personageSpecies
personageStatus.text = personage.personageStatus
personageGender.text = personage.personageGender
}
private fun loadingImage(string: String, imageView: ImageView){
Picasso.get().load(string).into(
imageView, object : Callback {
override fun onSuccess() {
Log.d("OK", "OK")
}
override fun onError(e: Exception?) {
Log.d("Error", "Error")
}
})
}
}
}
фрагмент
class EpisodeDetailFragment : Fragment(R.layout.fragment_episode_details) {
private val episodeDetailsViewModel by viewModels<EpisodeDetailsViewModel>()
private lateinit var goEpisodeBack: GoEpisodeBack
private lateinit var binding: FragmentEpisodeDetailsBinding
private lateinit var personageAdapter: PersonageAdapter
private lateinit var itemPersonageSelected: PersonageListFragment.ItemPersonageSelected
private var myId = 0
companion object {
fun newInstance(id: Int) = EpisodeDetailFragment().apply {
val bundle = Bundle()
bundle.putInt(EpisodeListFragment.EPISODE_LIST_TAG, id)
arguments = bundle
}
}
override fun onAttach(context: Context) {
super.onAttach(context)
goEpisodeBack = context as GoEpisodeBack
itemPersonageSelected = context as PersonageListFragment.ItemPersonageSelected
personageAdapter = PersonageAdapter { i ->
itemPersonageSelected.onItemPersonageSelected(i)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (arguments != null) {
myId = requireArguments().getInt(EpisodeListFragment.EPISODE_LIST_TAG)
episodeDetailsViewModel.getPersonage(myId)
}
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentEpisodeDetailsBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
episodeDetailRecyclerView.adapter = personageAdapter
episodeDetailsViewModel.episodeLiveData.observe(viewLifecycleOwner) {
episodeName.text = it.episodeName
episodeNumber.text = it.episode
episodeAirFate.text = it.episodeAirFate
}
toolbar.setNavigationOnClickListener {
goEpisodeBack.onGoEpisodeBack()
}
episodeDetailsViewModel.personageLiveData.observe(viewLifecycleOwner)
{
personageAdapter.personageList = it
}
}
interface GoEpisodeBack {
fun onGoEpisodeBack()
}
}
Я так понимаю что нужно реализовать ее во VM но не понимаю как, помогите пожалуйста(