【发布时间】:2021-01-24 13:52:53
【问题描述】:
我在单独的标签中有 tablayout 和 2 fragments。
Fragment A 有一个被覆盖的方法,当 Activity(从 Fragment A 开始)在其销毁时返回数据时返回数据:
public class Fragment A extends Fragment {
...
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if(resultCode != RESULT_CANCELED) {
assert data != null;
String accountTransaction = data.getStringExtra("Account");
String categoryTransaction = data.getStringExtra("Category");
Double getDouble = data.getDoubleExtra("Value", 0);
TransactionNewItem item = new TransactionNewItem(String.valueOf(getDouble),accountTransaction,categoryTransaction);
model.setSelected(item);
}
super.onActivityResult(requestCode, resultCode, data);
}
}
在同样的方法中,我调用 ViewModel 来观察 TransactionNewItem 对象:
public class TransactionViewModel extends ViewModel {
private final MutableLiveData<TransactionNewItem> selected = new MutableLiveData<>();
public void setSelected (TransactionNewItem item){
selected.setValue(item);
}
public LiveData<TransactionNewItem> getSelected() {
return selected;
}
}
Activity 返回数据后,使用新值创建一个新 POJO,并将存储在此 POJO 中的数据发送到 Fragment B,其中基于来自 Fragment 的数据创建 RecyclerView 的新项目
public class Fragment B extends Fragment {
...
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
initObserve();
initRecView();
super.onViewCreated(view, savedInstanceState);
}
//init RecyclerView
private void initRecView(){
binding.transactionView.setLayoutManager(new LinearLayoutManager(requireContext()));
adapter = new TransactionRecViewAdapter(listContentArr);
adapter.setListContent(listContentArr);
binding.transactionView.setAdapter(adapter);
}
//observe data from Fragment A and create object based on it
private void initObserve(){
model = new ViewModelProvider(requireActivity()).get(TransactionViewModel.class);
model.getSelected().observe(getViewLifecycleOwner(), item -> {
TransactionItem newAccountItem = new TransactionItem() ;
newAccountItem.setTransactionValue(item.getTransactionValue());
newAccountItem.setTransactionCategory(item.getTransactionCategory());
newAccountItem.setTransactionAccount(item.getTransactionAccount());
listContentArr.add(0,newAccountItem);
adapter.notifyDataSetChanged();
});
}
}
但是,它只会在 RecyclerView 中添加 1 个项目,并在 Activity 返回新数据时替换它。如果用户没有至少一次切换到 Fragment B,就会发生这种情况,因为在用户切换到 Fragment B 之前不会调用 onViewCreated。
如果用户之前从未切换到Fragment B,如何让ViewModel观察Fragment A的数据,并在每次Activity返回新数据时在Fragment B Recyclerview中创建新的TransActionItem?
提前致谢
【问题讨论】:
标签: android android-fragments mvvm android-recyclerview android-livedata