如何存储 recyclerview 数据,同时通过底部导航更改视图(片段)?

How to store recyclerview data , while changing view (Fragments) via Bottom Navigation?

我正在关注这个问题

我也找到了 How to save state of view class? and .

上下文

我在我的一个片段中以 DataModel(实现 Parcelable) 形式向 recyclerview 提供数据。 使用底部导航和 ROOM DB(获取和保存数据)。

我都做了什么

我在第一个 link 和我的代码中使用了代码。但是我看不懂第四段代码,里面用的是什么(我没有response.boddy(), Error)。 无论如何,每次更改视图时 savedInstanceState = null 所以代码正在重做。

我想问什么

我不想每次通过底部导航更改视图时都重做?

我做错了什么,数据没有保存在 savedInstanceState 中?

我的片段视图

    private ArrayList<DataModel> data;

    public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    
    root = inflater.inflate(R.layout.fragment_home, container, false);
    currentContext = getContext();
    
    
    recyclerView = (RecyclerView) root.findViewById(R.id.recyclerViewHome);
    recyclerView.setHasFixedSize(true);


    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    this.data = new ArrayList<>();
    
    adapter = new CustomAdapter(data, currentContext, 1);
    recyclerView.setAdapter(adapter);

    
    if (savedInstanceState != null) {
        
        // Retrieve the data you saved
        data = savedInstanceState.getParcelableArrayList("saved_data");

        //Call method to reload adapter record
        recyclerViewsaveInstance(data);
    } 
     else {
        
        //No data to retrieve

        dataAsynTask; //deleted, Basicly I get the data from DB, convert it to DataModel and give them to recyclerview.
    }

    return root;
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);

    Log.i("savedInstanceState", "loading");
    
    savedInstanceState.putParcelableArrayList("saved_data", this.data);
    
    super.onSaveInstanceState(savedInstanceState);

}


public void recyclerViewsaveInstance(ArrayList<DataModel> dataset)
{
    this.data = dataset;
    adapter = new CustomAdapter(dataset, getContext(), 1);
    recyclerView.setAdapter(adapter);//notify adapter about the new record
    adapter.notifyDataSetChanged();
}

我想你想在这里做的是将你的 AsyncTask 移到 Activity 水平,让你的 Fragment 向 Activity 询问 List<DataModel>.

在你的 Fragment 的 onCreateView() 方法中,而不是写

this.data = new ArrayList<>();

然后检查savedInstanceState并有条件地执行一个AsyncTask,你可以这样写:

this.data = ((MyActivity) getActivity()).getData();

然后,在您的 Activity 中,您将实现此 getData() 方法:

public List<DataModel> getData() {
    if (data != null) {
        return data;
    } else {
        // kick off AsyncTask here
        return Collections.emptyList();
    }
}

当 AsyncTask 完成时,更新 Activity 的 data 字段并通知 Fragment 有新数据可用。在片段中,你会有这样的方法:

public void onDataFetched(List<DataModel> data) {
    this.data = data;
    adapter.notifyDataSetChanged();
}

以上所有操作的最终结果是 Activity 现在负责加载数据和保存数据。 Fragment 对数据库或缓存一无所知;它只知道在显示数据时向 Activity 询问数据。

由于 Activity 在您使用底部导航在片段之间切换时保持活动状态,因此当您切换标签时它会成功地保持数据活动。