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

问题描述 投票:0回答:1

我制作了一个recyclerview网格,一旦用户按下按钮,它就会填充来自api的数据。旋转屏幕后,短暂恢复滚动位置,然后再滚动回到网格顶部。我正在使用https://medium.com/androiddevelopers/restore-recyclerview-scroll-position-a8fbdc9a9334保留滚动位置:

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)
    }
}

我也尝试保存布局状态RecyclerView store / restore state between activities

我的清单条目是:

<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>
android android-recyclerview
1个回答
0
投票

屏幕旋转是一次配置更改,它导致活动重新创建,因此您失去了滚动位置。

尽管您可以保存位置并恢复。

您还可以使您的活动忽略配置更改,以使它不会重新创建。通过在清单中执行此操作:

<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>
© www.soinside.com 2019 - 2024. All rights reserved.