我正在使用 Google的类参考RecyclerViewFragment示例 这个示例使用静态数据
private fun initDataset() {
dataset = Array(DATASET_COUNT, {i -> "This is element # $i"})
}
我将来自服务器的数据延迟连接到此示例,因此它 recyclerView.adapter = CustomAdapter(dataset)可以提前工作。
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val rootView = inflater.inflate(R.layout.recycler_view_frag,
container, false).apply { tag = TAG}
recyclerView = rootView.findViewById(R.id.recyclerView)
// LinearLayoutManager is used here, this will layout the elements in a similar fashion
// to the way ListView would layout elements. The RecyclerView.LayoutManager defines how
// elements are laid out.
layoutManager = LinearLayoutManager(activity)
currentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER
if (savedInstanceState != null) {
// Restore saved layout manager type.
currentLayoutManagerType = savedInstanceState
.getSerializable(KEY_LAYOUT_MANAGER) as LayoutManagerType
}
setRecyclerViewLayoutManager(currentLayoutManagerType)
// Set CustomAdapter as the adapter for RecyclerView.
recyclerView.adapter = CustomAdapter(dataset)
return rootView
}
这就是我所做的
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
...
mDownloadInformationFromTheServerNews.initWorkingWithData(object : DownloadInformationFromTheServerNews.WorkingWithData{
override fun getData(list: ArrayList<ArticlesList>) {
DATASET_COUNT = list.size
lists.addAll(list)
positions += 30
val handler = android.os.Handler()
handler.postDelayed({
remove() /Как только данные пришли, сообщаю адаптеру.
}, 2000)
}
})
remove() // Если это не сделаю, старые данные не увижу, которые
// отображаются после переворота экрана
return rootView
}
这就是我得到的。为什么会这样?
一旦我翻转屏幕,第二个方法调用就会触发remove(),我会看到之前保存的位置,但是一旦remove()调用第一个列表,它就会返回到第一个位置。
如果您删除第二个呼叫remove(),那么我将看不到保存的位置,而只会在计时器到期后返回到第一个位置。
如果您删除计时器中的第一个remove(),一切都会好起来的,但这是您需要报告数组中的数据已更新的方式。否则,第一次启动时,数据不会显示,需要将手机翻过来。

我可以告诉你,当你旋转时,活动完全重建。包括所有方法都被重复调用:从这里你还可以看到第二个 remove。如果重建是由屏幕旋转引起的,我认为您应该触发屏幕旋转而不是重新查询服务器(并清除适配器)。对不起,但我无法帮助实施,我没有合适的例子。