【发布时间】:2016-10-02 15:24:54
【问题描述】:
我的应用由 1 个片段组成。这个片段包含一个带有大量条目的回收器视图。
症状是设备旋转后似乎无法将回收站视图滚动到保存的位置。无论我做什么,结果都没有滚动。所以,UI中发生了奇怪的事情。
EDIT(揭示根本原因)...
在我的活动中,我有这个代码......
if (findViewById(R.id.fragment_container) != null) {
FragmentCategoryChecklist f2 = new FragmentCategoryChecklist();
Bundle b = new Bundle();
b.putString("contents", "Category Fragment");
f2.setArguments(b);
getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, f2).commit();
}
这是错误的!请参阅下面的代码。
使用此代码旋转设备时,每次都会创建一个新片段。这是错误的,因为 Android 已经重新创建(保存的)片段。
这样做的结果是代码用实例数据创建了一个片段,然后立即销毁,然后在没有任何实例数据的情况下重新创建。没有保存的实例数据意味着没有滚动到以前保存的位置。
正确的代码如下所示。对不起,我的问题只是一个症状,并没有显示根本原因。
Fragment f = getSupportFragmentManager().findFragmentById( R.id.fragment_container);
if( f == null) {
if (findViewById(R.id.fragment_container) != null) {
FragmentCategoryChecklist f2 = new FragmentCategoryChecklist();
Bundle b = new Bundle();
b.putString("contents", "Category Fragment");
f2.setArguments(b);
getSupportFragmentManager().
beginTransaction().
replace(R.id.fragment_container, f2).
commit();
}
}
【问题讨论】:
-
我认为您可以尝试使用 UI 处理程序。将
Runnable发布到 UI 消息队列并尝试在那里findLastCompletelyVisibleItemPosition。这将保证这个 Runnable 将在生命周期回调之后执行。如果这不起作用,请在此处发布一些代码,因为很难找到问题。 -
你能详细说明你的答案吗?
-
我没有发布这个作为答案,因为我不能 100% 确定它会起作用,所以我请你试试。 @bpr10 的解决方案有效吗?
-
如果你没有明白我的意思,试试这样:
uiHandler.post(new Runnable() { @Override public void run() { ((LinearLayoutManager) recyclerview.getLayoutManager()).findLastCompletelyVisibleItemPosition()); // this shouldn't return -1 }})。其中uiHandler是附加到UI 线程的Handler对象。 -
我已将我的代码添加到问题中。您将看到选项 1 ... 在 findLastCompletelyVisibleItemPosition() 上返回 -1。您的选项 2 我也添加了,再次返回 -1。
标签: android android-recyclerview