android kotlin只需再加载一个元素即可解决recyclerview问题

px9o7tmv  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(309)

我只想用一个滚动手势加载一个元素。现在它就像一个滚动手势加载1个或几个新元素(取决于滚动手势的时间)。作为一个解决方案,我可以在短于500毫秒的时间内做这个手势,或者使这个postdayed的延迟更长,但我想有更好的解决方案。你知道怎么做吗?
这个应用程序是以mvp模式编写的。这是我的密码:
currencyfragmentlist.kt

  1. private fun addScrollerListener() {
  2. rvItem.addOnScrollListener(object : RecyclerView.OnScrollListener() {
  3. override fun onScrollStateChanged(_rvItem: RecyclerView, newState: Int) {
  4. super.onScrollStateChanged(_rvItem, newState)
  5. Log.e("scroll", isLoading.toString())
  6. if (!isLoading) {
  7. if (!_rvItem.canScrollVertically(1)) {
  8. loadMore()
  9. isLoading = true
  10. }
  11. }
  12. }
  13. })
  14. }
  15. private fun loadMore() {
  16. showProgressDialog()
  17. var numberOfDays = mainPresenter.getNumberOfMinusDays()
  18. numberOfDays++
  19. mainPresenter.saveNumberOfMinusDaysIntoSp(numberOfDays)
  20. var dateMinusXDays = mainPresenter.currentDateMinusXDaysToStr(numberOfDays)
  21. val nextLimit = listSize + 1
  22. for (i in listSize until nextLimit) {
  23. if (mainPresenter.checkIfSuchDateExistsinSp(dateMinusXDays)) {
  24. Log.d("such date already exists in shared prefs", dateMinusXDays)
  25. handler.postDelayed({
  26. mainPresenter.processDateWithoutMakingACall(dateMinusXDays)
  27. }, 500)
  28. } else {
  29. mainPresenter.makeACall(dateMinusXDays)
  30. Log.d("retrofit call made", dateMinusXDays)
  31. }
  32. }
  33. itemAdapter.notifyDataSetChanged()
  34. }
  35. override fun hideProgressDialog() {
  36. if (apiResponseList.size > 1) {
  37. apiResponseList.removeAt(apiResponseList.size - 1)
  38. listSize = apiResponseList.size
  39. itemAdapter.notifyItemRemoved(listSize)
  40. } else progress_bar.visibility = View.GONE
  41. isLoading = false
  42. }
  43. override fun assignResponseToRecyclerview(apiResponse: ApiResponse?) {
  44. rvItem.apply {
  45. layoutManager = _layoutManager
  46. apiResponseList.add(apiResponse!!)
  47. itemAdapter = activity?.let { ItemAdapter(apiResponseList, it) }!!
  48. adapter = itemAdapter
  49. }
  50. Log.e("assign", isLoading.toString())
  51. }

mainpresenter.kt

  1. override fun makeACall(date: String?) {
  2. //view.showProgressDialog()
  3. date?.let { restModel.fetchApiResponse(this, it) }
  4. }
  5. fun processDateWithoutMakingACall(date: String) {
  6. val apiResponse = processRawJson(sp.getString(date, "").toString())
  7. passResponseToView(apiResponse)
  8. }
  9. override fun processRawJson(rawJson: String): ApiResponse {
  10. val parser = JsonParser()
  11. val rootObj = parser.parse(rawJson).asJsonObject
  12. var ratesObj = JsonObject()
  13. var ratesKeys: Set<String> = HashSet()
  14. val ratesArrayList: ArrayList<Currency> = ArrayList()
  15. val rootKeys = rootObj.keySet();
  16. var baseValue = ""
  17. var dateValue = ""
  18. for (key in rootKeys) {
  19. if (key == "base")
  20. baseValue = rootObj.get(key).asString
  21. if (key == "date")
  22. dateValue = rootObj.get(key).asString
  23. if (key == "rates") {
  24. ratesObj = rootObj.get(key).asJsonObject
  25. ratesKeys = ratesObj.keySet()
  26. }
  27. }
  28. for (key2 in ratesKeys) {
  29. Log.e("ratesKey", key2)
  30. Log.e("ratesValue", ratesObj.get(key2).asFloat.toString())
  31. ratesArrayList.add(Currency(key2, ratesObj.get(key2).asFloat))
  32. }
  33. saveRawJsonIntoSp(rawJson, dateValue)
  34. return ApiResponse(baseValue, dateValue, ratesArrayList, false)
  35. }
  36. override fun passResponseToView(apiResponse: ApiResponse?) {
  37. view.hideProgressDialog()
  38. view.assignResponseToRecyclerview(apiResponse)
  39. }

restmodel.kt

  1. override fun fetchApiResponse(presenter: MainPresenter, date: String) {
  2. job = CoroutineScope(Dispatchers.IO).launch {
  3. val response = userService.getCurrenciesForDate(date)
  4. withContext(Dispatchers.Main) {
  5. if (response.isSuccessful) {
  6. val rawJson = response.body()
  7. val apiResponse = presenter.processRawJson(rawJson)
  8. presenter.passResponseToView(apiResponse)
  9. }
  10. }
  11. }
  12. }

任何帮助都将不胜感激。提前谢谢你!

2q5ifsrm

2q5ifsrm1#

尝试使用snaphelper,它可能会减慢布局管理器进行更多回调并停止重载

相关问题