【问题标题】:RecyclerView is empty when restoring fragment from backStack从 backStack 恢复片段时 RecyclerView 为空
【发布时间】:2016-12-29 01:30:20
【问题描述】:

我在片段中有一个RecyclerView,最初是隐藏的。当用户单击一个按钮时,我将 RecyclerView 的可见性设置为 true,并在 ArrayList 上显示一些数据。

当我在顶部移动另一个片段时问题就开始了(我在 backStack 中添加了带有 RecyclerView 的前一个片段):如果我从新片段中单击返回,则前一个片段(带有 RecyclerView 的片段)是可见并在onCreateView() 中记录了我用于recyclerView 的数据集的值,一切都在那里,但是recyclerView 是空的(只显示页脚项)。

如果我们用RecyclerViewNextFragment 调用RvFragment 片段,那么进入后台堆栈然后离开架构的片段是:

                                     (back pressed)
RvFragment ----------> NextFragment  ------------> RvFragment 

这是来自onCreateView() 的代码:

@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_photo_comments, container, false);
    ButterKnife.bind(this, view);

    Timber.i("onCreateView data.size == %d", commentArrayList.size());

    setToolbarTitle();

    Picasso.with(getActivity())
            .load(photo)
            .placeholder(R.drawable.ic_timeline_image_placeholder)
            .centerCrop()
            .fit()
            .into(ivPhoto);

    if (hasCommentsVisible) {
        Timber.i("comments are visible!! and dataSize == %d", commentArrayList.size());
        llFlagsCommentsContainer.setVisibility(View.GONE);
        rvCommentsList.setVisibility(View.VISIBLE);
    }

    tvComments.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            hasCommentsVisible = true;
            llFlagsCommentsContainer.setVisibility(View.GONE);
            rvCommentsList.setVisibility(View.VISIBLE);
        }
    });

    initRecyclerView();

    return view;
}

您可以通过上面代码中的日志语句看到我可以确认数据存在。谢谢!

【问题讨论】:

  • 您何时以及如何填充commentArrayList
  • onCreate() 内部我开始一个Retrofit 调用并在一个方法中接收数据:@Override public void showData(Comment comment) { commentArrayList.add(comment); adapter.addItem(comment); adapter.notifyDataSetChanged(); }

标签: android android-fragments android-recyclerview


【解决方案1】:

我不确定我是否理解您如何设置片段堆栈,但只是为了确定:如果片段仍在堆栈上,当您按下后退按钮时不会再次调用 onCreateView。

https://developer.android.com/training/basics/fragments/fragment-ui.html#Replace

transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

只有 onStart() 会。

如果你想再次调用 onCreateView 那么你需要使用

FragmentTransaction.replace(NextFragment) 

没有 addToBackStack() 但这意味着整个片段将从头开始重新创建。可能不是您想要的,尤其是当您从 Web 服务获取数据时。

或者,要在每次返回片段时完全重新创建片段,您可以简单地将其完全删除:

FragmentTransaction.remove(RvFragment) 

然后推送你的下一个片段

【讨论】:

  • 对不起,我应该提到我正在使用一个名为FragNav 的库来将片段保存到后台堆栈中。所以真正发生的是视图只被破坏并且实例变量持续存在(这就是为什么我可以看到日志并告诉 cmetsArrayList 不是空的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多