簡體   English   中英

旋轉后無法恢復recyclerview滾動position

[英]cannot restore recyclerview scroll position after rotation

我制作了一個 recyclerview 網格,一旦用戶按下按鈕,就會填充來自 api 的數據。 旋轉屏幕后,滾動 position 會短暫恢復,然后再向上滾動到網格頂部。 我正在使用本教程來保存我的卷軸 position:

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

我還嘗試在本教程中保存布局 state。

我的清單條目是:

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

那么屏幕旋轉是一種配置更改,它會導致活動重新創建,因此您會丟失滾動的 position。

雖然可以保存 position 並恢復。

您還可以讓您的活動忽略配置更改,以便它不會重新創建。 通過在清單中執行此操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM