如何解决从菜单中调用setAdapter会使应用程序崩溃
单击菜单项时,我试图使用一个对话框。当对话框中没有recyclerview时,我可以成功完成此操作。
这里是处理菜单项单击以及对话框和recyclerview初始化的活动代码:
// Menu Stuff
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.add_exercise_activity_menu,menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.timer) {
Toast bread = Toast.makeText(getApplicationContext(),"Timer Selected",Toast.LENGTH_SHORT);
bread.show();
} else if (item.getItemId() == R.id.history) {
// Prepare to show exercise history dialog box
LayoutInflater inflater = LayoutInflater.from(AddExerciseActivity.this);
View view = inflater.inflate(R.layout.exercise_history_dialog,null);
AlertDialog alertDialog = new AlertDialog.Builder(AddExerciseActivity.this).setView(view).create();
// Declare local data structure
ArrayList<WorkoutExercise> All_Performed_Sessions = new ArrayList<>();
// Find all performed sessions of a specific exercise and add them to local data structure
for (int i = 0; i < MainActivity.Workout_Days.size(); i++) {
for (int j = 0; j < MainActivity.Workout_Days.get(i).getExercises().size(); j++) {
if (MainActivity.Workout_Days.get(i).getExercises().get(j).getExercise().equals(exercise_name)) {
All_Performed_Sessions.add(MainActivity.Workout_Days.get(i).getExercises().get(j));
}
}
}
// Set Exercise History Recycler View
RecyclerView recyclerView = findViewById(R.id.recyclerView_Exercise_History);
WorkoutExerciseAdapter4 workoutExerciseAdapter4 = new WorkoutExerciseAdapter4(AddExerciseActivity.this,All_Performed_Sessions);
// Crash Here
recyclerView.setAdapter(workoutExerciseAdapter4);
recyclerView.setLayoutManager(new LinearLayoutManager(AddExerciseActivity.this));
alertDialog.show();
}
return super.onOptionsItemSelected(item);
}
这是适配器代码:
public class WorkoutExerciseAdapter4 extends
RecyclerView.Adapter<WorkoutExerciseAdapter4.MyViewHolder> {
Context ct;
ArrayList<WorkoutExercise> Exercises;
public WorkoutExerciseAdapter4(Context ct,ArrayList<WorkoutExercise> Exercises) {
this.ct = ct;
this.Exercises = new ArrayList<>(Exercises);
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType) {
LayoutInflater inflater = LayoutInflater.from(this.ct);
View view = inflater.inflate(R.layout.workout_exercise_row4,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder,int position) {
// Change TextView text
holder.tv_date.setText(Exercises.get(position).getDate());
// Recycler View Stuff
// Change RecyclerView items
WorkoutSetAdapter workoutSetAdapter = new WorkoutSetAdapter(ct,Exercises.get(position).getSets());
holder.recyclerView.setAdapter(workoutSetAdapter);
holder.recyclerView.setLayoutManager(new LinearLayoutManager(ct));
}
@Override
public int getItemCount() {
return this.Exercises.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv_date;
RecyclerView recyclerView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tv_date = itemView.findViewById(R.id.tv_date);
recyclerView = itemView.findViewById(R.id.recycler_view_day);
}
}
}
我尝试使用getApplicationContext()
,this
,Activityname.this
,但似乎没有任何效果,而且我总是在同一行setAdapter(...)
上崩溃。
解决方法
尝试更改此内容:
RecyclerView recyclerView = findViewById(R.id.recyclerView_Exercise_History);
对此:
RecyclerView recyclerView = view.findViewById(R.id.recyclerView_Exercise_History);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。