刷新片段中的回收器视图



我有2个活动:RoutineViewer和ExerciseViewer。这两个活动都包含片段,这些片段是ParentFragment.java的子类。

RoutineViewer的片段 (RoutineViewerFragment( 正在显示回收器视图。回收器视图的数据来自ParentFragment.java中的静态 ArrayList。

从 RoutineViewerFragment,我可以启动 ExerciseViewer 活动,其中的片段(ExerciseViewerFragment(用于更改 ParentFragment.java 中的customRoutineExercise。在 ExerciseViewerFragment 中进行更改后,我可以在 ExerciseViewer.java 上调用requireActivity().finish(),这将带我回到 RoutineViewerFragment。但是,我的问题是 RoutineViewerFragment 中的数据没有反映我在 ExerciseViewerFragment 中所做的更改。

我尝试过的一些解决方案(但在这种情况下不起作用(查看其他类似问题:

// In RoutineViewerFragment onResume() with if else conditions
mAdapter.notifyItemChanged(// insert relevant position);
// In RoutineViewer.java onResume() with if else
getSupportFragmentManager().beginTransaction.detach(currentfragment).attach(currentfragment).commit()

我猜mAdapter.notifyItemChanged(position)不起作用的原因是因为我没有直接在 mAdapter 的构造函数中传递静态customRoutineExercise,而是传递 HashMap 的值。

至于.detach().attach(),我读到它强制onCreateView()再次运行,理论上应该使用更新的数据刷新回收器视图,但事实并非如此。

我在下面留下了重要的代码段。任何帮助不胜感激,谢谢!

父片段.java

protected static int selectedCustomRoutine;
protected static int selectedCustomExercise;
protected static ArrayList<customRoutine> customRoutineInfo = new ArrayList<>();
protected static HashMap <Integer, ArrayList<customExercise>> customRoutineExercise = new HashMap<>();

例程查看器.java

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_routine_viewer);
Intent intent = getIntent();
routineType = intent.getStringExtra("routineType");
routinePosition = intent.getIntExtra("routinePosition", 0);
selectedFragment = new RoutineViewerCustomFragment(routinePosition);
getSupportFragmentManager().beginTransaction().replace(R.id.routineV_fragment_container, selectedFragment).commit();
break;
}

RoutineViewerFragment.java

private int routinePosition;
public RoutineViewerCustomFragment(int routinePosition) {
// constructor
this.routinePosition = routinePosition;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_routine_viewer_custom, container, false);
buildRecyclerView(rootView);
return rootView;
}
// other code
private void buildRecyclerView(View rootView) {
mRecyclerView = rootView.findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getActivity());
mAdapter = new RoutineViewerCustomAdapter(customRoutineExercise.get(routinePosition));
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(mAdapter);
}
// Other code
private void goExerciseViewer(int position) {
selectedCustomExercise = //number;
selectedCustomRoutine = //number;
}

ExerciseViewerFragment.java

private void saveChanges() { 
customRoutineExercise.get(selectedCustomRoutine).get(selectedCustomExercise).setSetNumber(Integer.parseInt(editText1.getText().toString()));
customRoutineExercise.get(selectedCustomRoutine).get(selectedCustomExercise).setRepNumber(Integer.parseInt(editText2.getText().toString()));
}

代码气味:The recyclerview's data is from a static ArrayList in ParentFragment.java.

别这样。

有一个存储库,用于存储"回收者视图列表"(练习?(,并让回收器视图请求(或观察是否使用 ViewModel(列表。

在您修改此列表的片段上,通过自己的视图模型或共享的存储库或您使用的任何内容与同一存储库进行对话(如果不熟悉,请搜索Android ViewModels jetPack(。

这样,当 recyclerView 返回时,它将要求一个新列表(并将获得更新的副本(,或者如果观察到,它将收到新列表可用的通知。

传递给适配器的列表是/应该是副本/不可变的。

这不一样,但它是一个具有回收器视图的活动,并直接将数据"请求"到存储库。(此示例与您的问题无关,但请注意适配器是虚拟的,它只是被告知显示列表(。

https://github.com/Gryzor/CheckBoxCounter/blob/master/app/src/main/java/com/androidonlinux/checkboxcounter/MainActivity.kt

相关内容

最新更新