4

我想就我正在尝试解决的 Android Up 导航问题的解决方法询问您的意见。我有一个带有 RecycleView 的活动(MainActivity),显示了一个可滚动的项目列表,从 API 中获取。每个项目都有一个 onclick 侦听器,它打开项目详细信息活动,如下所示:

Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra("item", item);
context.startActivity(intent);

DetailActivity 有向上按钮,用户可以在此处返回上一个活动。这是此活动的清单:

<activity
    android:name=".DetailActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.Base"
    android:parentActivityName=".MainActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity" />
</activity>

这就是问题所在:当我导航到父活动时,滚动列表被重置并位于顶部。如果我使用设备上的后退按钮,则会保留列表并保留滚动位置,但当我单击向上按钮时不会...

我意识到,为了恢复滚动列表,我必须将已加载项目的列表保留在某处,也许将其传递给 DetailActivity 并返回,但我不确定这是最好的解决方案。有没有更好的解决方案,更优雅和原生的解决方案来保留滚动项和滚动位置?我已阅读有关向上导航的Android 文档,但找不到答案...

4

2 回答 2

4

如果按“BACK”对您的应用来说看起来不错,那么只需捕获“UP”事件:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case android.R.id.home:
            // simulate the "BACK" key
            onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}
于 2017-10-23T19:15:24.280 回答
0

对于我的列表,这是我保存索引的方式以及在该索引处恢复 RecyclerView 的方式(在顶部):

// save index and top position
int index = mList.getFirstVisiblePosition();

View v = mList.getChildAt(0);
int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop());

// ...

// restore index and position
mList.setSelectionFromTop(index, top);

信用:伊恩(堆栈溢出)

保留已加载项目的子列表对于您的应用程序来说太重了......

于 2017-10-23T19:13:58.587 回答