这将是最长的帖子,并且如果这个问题被关闭或投反对票,我不会感到生气,因为我自己无法解决此问题,并且需要专业程序员的帮助。
因此,每个人都知道诸如Facebook,Twitter或Gmail之类的应用程序。在每个这些应用程序中,我们都使用列表。我认为这些列表基于具有分页库的Recyclerview
。我想在我的应用程序中创建类似的列表,但是我不知道该怎么做。
我现在所拥有的:
我的方法用新数据重新创建了recyclerView,它看起来不是很好。我有几种创建无限列表的解决方案:
使用基于scrollListener的当前解决方案:
msgLst.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
val visibleItemCount = mLayoutManager.childCount
val totalItemCount = mLayoutManager.itemCount
val pastVisibleItems = mLayoutManager.findFirstVisibleItemPosition()
if (loading) {
if (visibleItemCount + pastVisibleItems >= totalItemCount /*&& !recyclerView.canScrollVertically(1)*/) {
if (nextUrl != null) {
if (sp.getLong("expires_in", 0) - sp.getLong("time_delta", 0) - System.currentTimeMillis() / 1000 <= 60) {
error["message"] = "access_token_expired"
error["request_no"] = "7"
Singleton.workingWithErrors(error, context!!)
} else {
getMessages(type, Integer.parseInt(Uri.parse(nextUrl).getQueryParameter("offset")), true)
}
}
}
}
if (dy >= 30) {
loading = true
}
if (dy < 0) {
if (loading) {
if (mLayoutManager.findFirstVisibleItemPosition() - mLayoutManager.childCount <= 0 /*&& !recyclerView.canScrollVertically(-1)*/) {
loading = false
if (prevUrl != null) {
if (sp.getLong("expires_in", 0) - sp.getLong("time_delta", 0) - System.currentTimeMillis() / 1000 <= 60) {
error["message"] = "access_token_expired"
error["request_no"] = "7"
Singleton.workingWithErrors(error, context!!)
} else {
Singleton.m_offset = Integer.valueOf(Uri.parse(prevUrl).getQueryParameter("offset"))
getMessages(type, Integer.parseInt(Uri.parse(prevUrl).getQueryParameter("offset")), true)
}
}
}
}
}
super.onScrolled(recyclerView, dx, dy)
}
})
此解决方案发送具有新偏移量的新请求:
Integer.parseInt(Uri.parse(prevUrl).getQueryParameter("offset")
它可以在顶部和底部发送请求,但是这种解决方案不够好。
PageKeyedDataSource
,但我不知道如何使用它而不是当前版本。我看到了很多解决方案列表无穷无尽的问题,但是除了创建扩展了PageKeyedDataSource的类之外,我什么也没做。现在在api调用之后,我得到了arrayList,然后将其发送到我的适配器:
val messageArrayList = response.body()!!.messages
adapter = MessageListAdapter((messageArrayList as ArrayList<MessageModel>), context!!, type)
adapter.notifyDataSetChanged()
msgLst.adapter = adapter
因此,要从“页面”获取数据,我必须传递从响应中获得的下一个/上一个偏移号。因此,我该如何使用pageingAdapter或其他解决方案来帮助我无休止地列出我现在拥有的清单。
P.S。如果对正确答案很重要,我可以发布适配器。
答案 0 :(得分:1)