【问题标题】:cannot restore recyclerview scroll position after rotation旋转后无法恢复recyclerview滚动位置
【发布时间】:2020-06-01 16:36:51
【问题描述】:

我创建了一个 recyclerview 网格,一旦用户按下按钮,就会填充来自 api 的数据。旋转屏幕后,滚动位置会短暂恢复,然后再向上滚动到网格顶部。我正在使用这个tutorial 来保留我的滚动位置:

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

我还尝试将布局状态保存在此 tutorial 中。

我的清单条目是:

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

    屏幕旋转是一种配置更改,它会导致 Activity 重新创建,因此您会丢失滚动位置。

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

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

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

    【讨论】:

    • 是的,它有效,但文档强烈建议不要这样做。
    • 因为他们认为你想在你的应用程序中处理屏幕方向的变化(也许通过设置一个新的横向布局),如果你不想处理那我认为没关系。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2020-11-08
    相关资源
    最近更新 更多