当前位置: 首页 > 知识库问答 >
问题:

旋转后无法恢复recyclerview滚动位置

罗淮晨
2023-03-14

我制作了一个recyclerview网格,一旦用户按下按钮,它就会被api中的数据填满。旋转屏幕后,滚动位置会短暂恢复,然后再向上滚动到网格顶部。我使用本教程来保留我的滚动位置:

class MainActivity : AppCompatActivity(), Main.View {
    private lateinit var carAdapter: CarAdapter
    private lateinit var presenter: Main.MainPresenter
    private lateinit var cars: ArrayList<Car?>

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        carsAdapter = CarsAdapter(mutableListOf())
        // line suggested by androiddevelopers article
        carsAdapter.stateRestorationPolicy = 
        RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY

        gridRV.layoutManager = GridLayoutManager(this, 3)
        gridRV.adapter = carsAdapter
        if (savedInstanceState != null) {
            cars = savedInstanceState.getParcelableArrayList<Car?>(CARS_ARG)
                    as ArrayList<Car?>
            carsAdapter.cars = cars
            carsAdapter.notifyDataSetChanged()
        }
        presenter = Main.MainPresenter(this, CarService(R.string.api_ul))
        search_button.setOnClickListener { presenter.onSearchClick() } 
    }

    // presenter.onSearchClick() calls this
    override fun displayGrid() {
        this.cars = cars
        carsAdapter.cars = cars
        carsAdapter.notifyDataSetChanged()
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putParcelableArrayList(CARS_ARG, cars)
    }
}

我还在本教程中尝试保存布局状态。

我的舱单条目是:

<activity
    android:name=".main.MainActivity"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

共有1个答案

利稳
2023-03-14

屏幕旋转是一种配置变化,它会导致活动重新创建,从而失去滚动的位置。

虽然你可以保存位置并恢复。

您还可以让您的活动忽略配置更改,这样它就不会重新创建。在清单中这样做:

<activity
    android:name=".main.MainActivity"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
 类似资料:
  • 我有一个从Firebase数据库检索数据的简单片段。我使用firebase recycler视图显示检索数据。在滚动或屏幕旋转后,我无法强制回收器视图(或线性布局管理器)恢复滚动位置。 我在这里找到了一些答案,但它们不起作用。 我的代码是: 公共类NewsListFragment扩展了ParentNewsFragment{ } 最后的showToast方法显示了位置的真实数量,但recyclerv

  • 抱歉,我的英语很差。 我想要确切的位置。并且在活动/片段被销毁后(不管是我销毁它还是系统销毁它),我重新打开活动/片段,< code > recycle view 也可以在它被销毁的相同位置。 “相同”并不意味着“项目位置”,因为项目可能只是上次显示的一部分。 我想恢复完全相同的位置。 我尝试了下面的一些方法,但没有人是完美的。 有人可以帮忙吗? 1.First方式。 我使用< code>onSc

  • 问题内容: 假设我有这样的活动: 视图模型为: 我想正确处理旋转,因此,如果用户在倒数计时为5时旋转设备,我希望旋转后的下一个值为5(如果第二个已经过去,则为4),只要在倒数应该实际出现的任何地方取。 如果火箭已经升空,我希望它在旋转后保持这种状态,我不希望倒计时再次开始。 此刻,暂停时取消订阅,恢复时进行新订阅,因此倒计时重新开始。 我猜想我应该在代码的RxJava部分中进行一些更改才能使其正常

  • 我有一个页面的正文在滚动。也就是说,body上的滚动事件侦听器起作用。但是,window和document上的滚动侦听器不会激发。 问题是,即使body是滚动的,$(“body”).scrolltop()始终返回0。我循环遍历了body的所有子级,没有一个scrollTop()大于0。有些孩子有溢出:隐藏,但应该不会影响滚动顶部,我猜。 我删除了高度:100%根据这个问题,我也经历了这个问题。 我

  • 我正在编写一个应用程序,它有一个带有按钮和图像的菜单。我按下按钮,按钮的标签从“录制曲目”更改为“停止录制”。问题是,当我旋转设备时,带有按钮的活动会被操作系统终止。因此,我知道我必须在数据在方法中被杀死之前保存数据,然后在我的method中恢复数据。类似这样: 和: 虽然它完美地恢复了我的图像,但我的菜单仍然有问题:由于某些原因,它总是保持为“空”,因此它永远不会更改按钮的标签,尽管每次“活动”

  • 是否有一种方法可以在完成刷取并对实例调用之后恢复刷取操作并将视图保持器还原到其初始位置?我使用了、和实例来完美地协同工作,在某些情况下,我只需要恢复swipe操作,而不删除被刷过的项。