有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java当应用程序被推送到后台并重新创建时,RecycleView不会恢复LayoutManager状态

我最初关注the accepted answer in this previously posted question关于如何保存和恢复RecyclerView的布局管理器

我在活动B中有我的RecyclerView。[注意:活动A将启动活动B,通过意图传输数据。]

当用户单击活动B中的viewholder时,将启动活动C。一旦活动C关闭并销毁,活动B就可见了,我可以在RecyclerView中看到所有恢复的数据

问题: 但是,如果我离开我的应用程序(即按Home键),它会被推到后台。恢复我的应用程序后,将再次调用onCreate()。正在保存LayoutManager的状态,但是我的数据没有显示在RecyclerView中

我可以说我的LayoutManager状态在调试后被保存。当从后台恢复应用程序后再次调用onCreate()时,显示如下:

Saved Instance State = Bundle[{ActivityB - Linear Layout State=安卓.support.v7.widget.LinearLayoutManager$SavedState@6358f8f, 安卓:viewHierarchyState=Bundle[mParcelledData.dataSize=1296]}]

经过几个小时的尝试,我不知道如何解决这个问题

我的代码:

public class ActivityB extends AppCompatActivity {

      private RecyclerView recyclerView;
      private LinearLayoutManager linearLayoutManager;
      private Parcelable linearLayoutState;
      private RecyclerAdapter adapter;
      private Button more;
      private String id;
      private List<VideoItem> list;
      private List<VideoItem> newList;
      private final String LINEARLAYOUT_STATE_KEY = "Activity B - Linear Layout State";

      @Override
      protected void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             setContentView(R.layout.activity_blayout);

             // Retrieving data from Activity A
             Intent intent = getIntent();
             Bundle bundle = intent.getBundleExtra("bundle");
             someClass.innerClass class = bundle.getParcelable("data");
             id = class.getID();
             list = class.getList();
             newList = new ArrayList<>();

             // Instantiating Recycler View
             recyclerView = (RecyclerView)findViewById(R.id.activityb_recyclerview);
             recyclerView.setNestedScrollingEnabled(false);

             linearLayoutManager = new LinearLayoutManager(context);
             recyclerView.setLayoutManager(linearLayoutManager);

             adapter = new RecyclerAdapter();
             recyclerView.setAdapter(adapter);

             moreButton = (Button)findViewById(R.id.activityb_more);
             moreButton.setOnClickListener(new fetchMoreClickListener());
        }

        @Override
        public void onResume(){
              if (linearLayoutState != null) {
                 linearLayoutManager.onRestoreInstanceState(linearLayoutState);
              } else {
                 // If no layout state is found, I need to populate my
                 // adapter.
                 // Here I am simply cloning my list again, to keep the original
                 // list intact. generateSubset() removes items from the cloned list 
                 // to create a smaller subset that is added to the adapter.
                 for (ListItem item : list){
                        newList.add(new ListItemi(item));
                 }
                 adapter.addItems(generateSubset(0));
              }
              super.onResume();
        }

        @Override
        protected void onSaveInstanceState(Bundle outState) {
               linearLayoutState = linearLayoutManager.onSaveInstanceState();
               outState.putParcelable(LINEARLAYOUT_STATE_KEY, linearLayoutState);
               super.onSaveInstanceState(outState);
        }

        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
               super.onRestoreInstanceState(savedInstanceState);
               linearLayoutState = savedInstanceState.getParcelable(LINEARLAYOUT_STATE_KEY);
        }

尚未覆盖其他活动生命周期方法。我没有收到任何错误消息。仅我的视图持有者中存储的数据不再显示在RecyclerView中

编辑1:

这是我的RecyclerAdapter代码:

公共类RecyclerAdapter扩展了RecyclerView。适配器{ 私人静态日期现在; 私人名单

public static class ItemHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener {

    private Context context;
    private String key;
    private Bundle itemBundle;
    private SimpleDraweeView photo;
    private TextView title;

    public ItemHolder(Context context, View view){
        super(view);

        this.context = context;
        this.key = null;
        this.itemBundle = null;
        photo = (SimpleDraweeView)view.findViewById(R.id.itemholder_photo);
        title = (TextView)view.findViewById(R.id.itemholder_title);
        view.setOnClickListener(this);
    }

    public void bindData(Item item){
        if (key == null){ key = item.getID(); }
        if (itemBundle == null){
            itemBundle = new Bundle();
            itemBundle.setClassLoader(Item.class.getClassLoader());
            itemBundle.putParcelable("data", item);
        }

        photo.setImageURI(Uri.parse(item.getPhotoURL()));
    }

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(context, ActivityB.class);
        intent.putExtra("bundle", itemBundle);
        context.startActivity(intent);
    }
}

public RecyclerAdapter(){
    this.list = new ArrayList<>();
    this.now = new Date();
}

public RecyclerAdapter(ArrayList<VideoItem> list){
    this.list = list;
    this.now = new Date();
    this.notifyItemRangeInserted(0, list.size());
}

@Override
public RecyclerAdapter.ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Context context = parent.getContext();
    View recyclerItem = LayoutInflater.from(context)
            .inflate(R.layout.itemholder_item, parent, false);

    return new ItemHolder(context, recyclerItem);
}

@Override
public void onBindViewHolder(RecyclerAdapter.ItemHolder holder, int position) {
    Item item = list.get(position);
    holder.bindData(item);
}

private static Date getNow(){ return now; }

private static void updateNow(){ now = new Date(); }

@Override
public int getItemCount() {
    return list.size();
}

public void addItem(Item item){
    list.add(item);
    this.notifyItemInserted(list.size() - 1);
}

public void addItems(ArrayList<Item> items){
    int oldSize = list.size();
    list.addAll(items);
    this.notifyItemRangeInserted(oldSize, items.size());
}

}


共 (1) 个答案

  1. # 1 楼答案

    尝试将onResume()方法更改为如下所示:

    @Override
        public void onResume(){
              super.onResume(); 
              if (linearLayoutState != null) {
                 linearLayoutManager.onRestoreInstanceState(linearLayoutState);
              } 
                 // Here comes the code to populate your data. 
                 // I'm not sure how you do this, so I just copy/paste your code
                 for (ListItem item : list){
                        newList.add(new ListItemi(item));
                 }
                 // Now instatiate and add the adapter to the RecyclerView
                 adapter = new RecyclerAdapter(newList);
                 recyclerView.setAdapter(adapter);
              }
        }