我正在创建锻炼列表,使用RecycleViewer显示该列表,并使用RecycleViewer Adapter和ViewHolder填充该列表。 RecycleViewer包含在一个片段中。
目标是显示一个新片段,其中显示选定(单击)锻炼的锻炼列表。
我设法用新的片段替换了片段,以显示练习列表,但是当我按下“后退”按钮时,将显示一个空白屏幕。我不确定是什么原因导致了这种行为。理想情况下,当按下后退按钮时,WorkoutsListFragment将再次显示。
您能帮我理解和解决此问题吗?
在我的WorkoutsActivity中,我有以下内容:
public class WorkoutsActivity extends AppCompatActivity implements WorkoutsListFragment.onWorkoutSelectedInterface {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_workouts);
WorkoutsListFragment workoutsListFragment = new WorkoutsListFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager
.beginTransaction()
.add(R.id.workouts_fragment_container, workoutsListFragment)
.commit();
}
@Override
public void onBackPressed() {
super.onBackPressed();
getSupportFragmentManager().popBackStackImmediate();
}
@Override
public void onWorkoutSelected(int workoutId) {
Log.i("****","workout : " + workoutId);
ViewWorkoutFragment viewWorkoutFragment = new ViewWorkoutFragment();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.workouts_fragment_container, viewWorkoutFragment)
.addToBackStack(null)
.commit();
}
}
为了简短起见,在WorkoutsListFragment中,我创建了onWorkoutSelectedInterface并在onAttach函数中分配了它的值,在该函数中我获得了父活动。
然后,在onCreateView函数中设置我的RecycleViewer。我将onWorkoutSelectedInterface传递给适配器,从中我将相同的接口传递给ViewHolder。
我的View持有人看起来像这样:
WorkoutListViewHolder(View card, WorkoutsListFragment.onWorkoutSelectedInterface onWorkoutSelectedInterface) {
super(card);
this.title = card.findViewById(R.id.workout_card_title);
this.subTitle = card.findViewById(R.id.workout_card_sub_title);
this.icon = card.findViewById(R.id.icon);
this.workoutId = 0;
card.setOnClickListener((View v) -> {
Log.i("view", ""+ this.workoutId);
onWorkoutSelectedInterface.onWorkoutSelected(9);
});
}
完整代码可在GitHub上找到:
https://github.com/michalorestes/getFitApp/tree/master/app/src/main/java/com/jds/fitnessjunkiess/getfitapp/Activities/WorkoutsActivity
预先感谢您浏览此:)
更新:
我想我越来越接近了解这个问题。
听起来很奇怪,this.dataSet.clear()删除了属性中的所有数据(按预期)和参数中的所有数据(意外!)。因此,在运行this.dataSet = dataSet;时。由于没有数据可显示,因此未显示视图。看起来两个变量都指向相同的内存位置:/
public void swapData(List<Workout> dataSet){
if (this.dataSet != null) {
this.dataSet.clear();
this.dataSet.addAll(dataSet);
}
else {
this.dataSet = dataSet;
}
notifyDataSetChanged();
}
最佳答案
我通过将交换功能更改为解决了这个问题:
public void swapData(List<Workout> data){
this.dataSet = data;
notifyDataSetChanged();
}