【问题标题】:Why is getFirstVisiblePosition right when rotating to horizontal, but wrong when rotating back?为什么 getFirstVisiblePosition 旋转到水平时正确,但旋转回来时错误?
【发布时间】:2013-03-12 19:27:31
【问题描述】:

我有一个 Android ListView。当用户转动设备时,我希望列表的可见部分保持(大致)相同。所以我在销毁活动时保存了第一个可见位置:

    @Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    this.currentPosition = this.listView.getFirstVisiblePosition();
    Log.i(TAG, "onSaveInstanceState, productFilter = " + this.productFilter + "; currentPosition = " + this.currentPosition);
    outState.putInt("productFilter", this.productFilter);
    outState.putInt("currentPosition", this.currentPosition);
}

(请忽略productFilter,它与这个问题无关。)我在onCreate中恢复它是这样的:

    Log.i(TAG, "onCreate");
    if (savedInstanceState != null) {
        this.productFilter = savedInstanceState.getInt("productFilter");
        this.currentPosition = savedInstanceState.getInt("currentPosition");
        Log.i(TAG, "productFilter = " + this.productFilter + "; currentPosition = " + this.currentPosition);
    }

将模拟器从垂直旋转到水平时,效果很好。当它旋转回垂直时,save 方法中的getFirstVisiblePosition() 总是返回零,尽管实际可见的项目已经很远了。这是日志的输出:

03-12 19:16:36.140: INFO/WindowManager(51): Config changed: { scale=1.0 imsi=0/0 loc=de_DE touch=3 keys=2/1/2 nav=3 orien=2 layout=34}
03-12 19:16:36.180: INFO/ExperimentalList(777): onSaveInstanceState, productFilter = 0; currentPosition = 53
03-12 19:16:36.190: INFO/ExperimentalList(777): onCreate
03-12 19:16:36.190: INFO/ExperimentalList(777): productFilter = 0; currentPosition = 53
03-12 19:16:36.220: INFO/WindowManager(51): onOrientationChanged, rotation changed to 0
03-12 19:16:36.220: INFO/WindowManager(51): Setting rotation to 0, animFlags=0
03-12 19:16:36.241: INFO/WindowManager(51): Config changed: { scale=1.0 imsi=0/0 loc=de_DE touch=3 keys=2/1/2 nav=3 orien=1 layout=34}
03-12 19:16:36.270: DEBUG/StatusBar(51): updateResources
03-12 19:16:36.340: DEBUG/StatusBar(51): updateResources
03-12 19:16:36.610: INFO/ExperimentalList(777): onSaveInstanceState, productFilter = 0; currentPosition = 0
03-12 19:16:36.620: INFO/ExperimentalList(777): onCreate
03-12 19:16:36.620: INFO/ExperimentalList(777): productFilter = 0; currentPosition = 0

有什么原因导致头寸第一次正确收益率为 53,但第二次为 0?我无法通过这里的日志来证明这一点,但我发誓我尝试了几次,但我从未回滚到零!

【问题讨论】:

  • 在改回之前手动滚动一下是否有效?以编程方式滚动到原始位置后,它可能不会更新可见位置。

标签: android listview lifecycle


【解决方案1】:

尝试使用 setSelection。之后

this.currentPosition = savedInstanceState.getInt("currentPosition");

添加

this.listView.setSelection(this.currentPosition);

*警告:这将更改您选择的项目。

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多