【问题标题】:Is there any way to retain recyclerview scroll position on back pressed有什么方法可以在后按时保留 recyclerview 滚动位置
【发布时间】:2020-11-11 06:41:03
【问题描述】:

我已经使用 Framelayout 在主要活动上加载了回收站视图,如果点击回收站项目,当我按下 recyclerview 自动滚动到顶部时转到另一个活动,但我想要以前的滚动位置帮助

请用代码告诉我,我是新手,请在我的代码中添加解决方案

public class Defence_Fragment extends Fragment {

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";


private String mParam1;
private String mParam2;
RecyclerView recyclerView;
Defence_Adapter defence_adapter;

public Defence_Fragment() {

}

public static Defence_Fragment newInstance(String param1, String param2) {
    Defence_Fragment fragment = new Defence_Fragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_defence_, container, false);

    recyclerView = view.findViewById(R.id.rcviewdef);
    recyclerView.setLayoutManager(new GridLayoutManager(getContext(),4));

    FirebaseRecyclerOptions<Items_Models> options =
            new FirebaseRecyclerOptions.Builder<Items_Models>()
                    .setQuery(FirebaseDatabase.getInstance().getReference().child("Defence"), Items_Models.class)
                    .build();

    defence_adapter = new Defence_Adapter(options,getContext());
    recyclerView.setAdapter(defence_adapter);

    return view;
}
@Override
public void onStart() {
    super.onStart();
    defence_adapter.startListening();
}

@Override
public void onStop() {
    super.onStop();
    defence_adapter.stopListening();
}

}

【问题讨论】:

  • 检查这个。在 Fragment 中使用 onBackPressed()。 stackoverflow.com/a/46425415。并将当前位置保存在 Fragment 中的 onBackPressed() 中

标签: android android-recyclerview


【解决方案1】:

您可以使用 onSavedInstanceState()onRestoreInstanceState()onResume() 方法中使用 parcelable 和更新 layoutManager。

【讨论】:

    【解决方案2】:

    检查您的 RecyclerView 是否在 NestedScrollView 内,如果是,请移除 NestedScrollView!在我的情况下,这导致在使用 Android 导航组件时返回 RecyclerView 顶部。

    【讨论】:

    • 对于这种情况你有什么解决办法吗?我目前有同样的问题,但我无法删除 NestesScrollView
    • 也许您可以使用具有不同视图类型的 RecyclerView 并删除 NestedScrollView,这样我设法解决了这个问题
    【解决方案3】:

    RecyclerView.Adapter.StateRestorationPolicy

    定义此适配器希望在查看后如何恢复其状态 重建(例如配置更改)。

    Doc

    用法

    adapter.stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
    

    StateRestorationPolicy 枚举有 3 个选项:

    ALLOW — 默认状态,即在下一个布局过程中立即恢复 RecyclerView 状态 PREVENT_WHEN_EMPTY — 仅当适配器不为空时(adapter.getItemCount() > 0)恢复 RecyclerView 状态。如果您的数据是异步加载的,则 RecyclerView 会等到数据加载完毕,然后才会恢复状态。如果您有默认项目,例如标题或加载进度指示器作为适配器的一部分,那么您应该使用 PREVENT 选项,除非使用 MergeAdapter 添加默认项目。 MergeAdapter 等待其所有适配器准备就绪,然后才恢复状态。 PREVENT — 推迟所有状态恢复,直到您设置 ALLOW 或 PREVENT_WHEN_EMPTY。

    【讨论】:

      猜你喜欢
      • 2017-01-23
      • 1970-01-01
      • 2015-05-26
      • 2017-03-13
      • 1970-01-01
      • 2012-04-06
      • 2019-04-13
      • 2021-05-06
      • 1970-01-01
      相关资源
      最近更新 更多