【发布时间】:2018-09-07 08:06:59
【问题描述】:
我在 NestedScrollView 中有 RecyclerView
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.v4.widget.NestedScrollView>
我在大项目中遇到了这个问题,为了找到解决这个问题的方法,我创建了没有其他视图的新项目。
这是 MainActivity 的完整代码
class MainActivity : AppCompatActivity() {
var mItems = mutableListOf<String>()
var mAdapter = MyAdapter(mItems)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recycler.layoutManager = LinearLayoutManager(this)
recycler.adapter = mAdapter
delayedLoadDataIfPossible(100)
recycler.viewTreeObserver.addOnScrollChangedListener {
delayedLoadDataIfPossible(100)
}
}
private fun delayedLoadDataIfPossible(delay: Long) {
Observable.timer(delay, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
var scrollingReachedEnd = isScrollingReachedEnd()
if (scrollingReachedEnd) {
loadData()
}
}
}
private fun isScrollingReachedEnd(): Boolean {
val layoutManager = LinearLayoutManager::class.java.cast(recycler.layoutManager)
val totalItemCount = layoutManager.itemCount
val lastVisible = layoutManager.findLastVisibleItemPosition()
return lastVisible + 5 >= totalItemCount
}
private fun loadData() {
Observable.timer(5, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnSubscribe { progress.visibility = View.VISIBLE }
.doFinally { progress.visibility = View.GONE }
.subscribe {
for (i in 1..10) {
mItems.add(i.toString())
}
mAdapter.notifyDataSetChanged()
delayedLoadDataIfPossible(100)
}
}
}
我正在使用 isScrollingReachedEnd 方法来识别滚动到列表末尾。如果最后可见项目少于 5 个,我正在尝试加载新数据。
loadData 模拟加载数据。它将 10 项添加到列表中,并通知适配器有关更改。
delayedLoadDataIfPossible 方法应该在一些延迟后工作,因为 findLastVisibleItemPosition 在项目添加到列表之前返回值。结果它返回错误的值。例如添加前 10 个项目后的 -1。
我的问题:当 NestedScrollView 中的 RecyclerView findLastVisibleItemPosition 返回错误的值并且即使有足够的项目也无法停止数据加载。当 RecyclerView 不在 NestedScrollView 中时,就不存在这样的问题。
我的问题:当 RecyclerView 在 NestedScrollView 内时,如何从 RecyclerView 获取最后一个可见项目的位置?
【问题讨论】:
-
有你设置
recyclerView.setNestedScrollingEnabled(false); -
你用过 findOneVisibleChild(layoutManager.getChildCount() - 1, -1, false, true)
-
@NileshRathod 我尝试将nestedScrollingEnabled 设置为false,但没有帮助
-
是this 的问题吗?
-
我实际上会将这些“上方”视图直接放入
RecyclerView本身。这意味着适配器必须管理该数据,这可能会干扰关注点分离;但是它可以完成工作。现在您没有发布包含所有布局的整个活动布局,所以我不知道该方法是否合适。发布更多布局和代码,然后我可能会为您回答这个问题。列表模型不一定必须是同质的。考虑到RecyclerView.Adapter具有getItemViewType()方法,因此您可以根据项目位置膨胀不同的视图。
标签: android android-recyclerview android-nestedscrollview