
현재 제가 만들고 있는 앱의 화면입니다.
루틴(운동) 리사이클러뷰는 각각 동적으로 세트를 추가하는 중첩리사이클러뷰를 가지고 있습니다.
각 운동은 추가하면 기본적으로 바로 1세트가 추가되어있는 상태로 추가됩니다.
그런데 보시다시피 첫운동은 잘 추가가 되는데 이후에 새로운 운동을 추가하면
기존에 추가했던 운동의 세트들이 다 초기화돼고 이후에 추가버튼을 누르면 세트다
모든 운동에서 같이 증가해버립니다..
저는 각운동에대해 세트를 추가하고싶은데 말이죠.. 단순 리사이클러뷰 안에 리사이클러뷰를
추가하면 되는줄 알았는데 그게 잘 되질않네요..이틀전부터 붙잡고있는데 뭐가 문제인지 잘모르겠습니다.
새 운동을 추가하면 왜 리셋되는지..
RoutineModel.java
public class RoutineModel {
String routine;
public ArrayList<RoutineDetailModel> arrayListDetail = new ArrayList<>();
public RoutineModel(String routine) {
this.routine = routine;
}
public String getRoutine() {
return routine;
}
}
RoutineAdapter.java
public class RoutineAdapter extends RecyclerView.Adapter<RoutineAdapter.ViewHolder> {
ArrayList<RoutineModel> routineItems;
RoutineDetailAdapter detailAdapter;
Context context;
public RoutineAdapter() {
routineItems = new ArrayList<>();
detailAdapter = new RoutineDetailAdapter();
}
public void addItem(RoutineModel item) {
routineItems.add(item);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
View itemView = inflater.inflate(R.layout.routine_item, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
RoutineModel curRoutineItem = routineItems.get(position);
holder.setItems(curRoutineItem);
//루틴 상세에 관한 최초 셋팅
holder.setRoutineDetailRecyClerView();
curRoutineItem.arrayListDetail.add(new RoutineDetailModel());
holder.routine_detail.setAdapter(detailAdapter);
detailAdapter.addItems(curRoutineItem.arrayListDetail);
holder.addSet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
detailAdapter.addItems(curRoutineItem.arrayListDetail);
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return routineItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView routine;
Button addSet;
RecyclerView routine_detail;
public ViewHolder(@NonNull View itemView) {
super(itemView);
initViews();
}
private void initViews() {
routine = itemView.findViewById(R.id.routine);
routine_detail = itemView.findViewById(R.id.detail_routine);
addSet = itemView.findViewById(R.id.add_set);
}
private void setItems(RoutineModel routineItem) {
routine.setText(routineItem.getRoutine());
}
public void setRoutineDetailRecyClerView() {
routine_detail.setLayoutManager(new LinearLayoutManager(context, RecyclerView.VERTICAL, false));
routine_detail.setHasFixedSize(true);
}
}
}
RoutineDetailModel.java
public class RoutineDetailModel {
String set;
String weight;
String reps;
}
RoutineDetailAdapter.java
public class RoutineDetailAdapter extends RecyclerView.Adapter<RoutineDetailAdapter.ViewHolder>{
ArrayList<RoutineDetailModel> items = new ArrayList<>();
public void addItems(ArrayList<RoutineDetailModel> items) {
this.items = items;
notifyDataSetChanged();
}
public ArrayList<RoutineDetailModel> getItem() {
return this.items;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.routine_detail_item, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
RoutineDetailModel item = items.get(position);
holder.setItem(item);
}
@Override
public int getItemCount() {
return items.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView set;
public ViewHolder(@NonNull View itemView) {
super(itemView);
set = itemView.findViewById(R.id.set);
}
private void setItem(RoutineDetailModel item) {
set.setText("TEST");
}
}
}
ㄱ그리고 추가적으로 추가버튼 안에
notifyDatasetChanged()가 있는데.. 이걸 주석처리하면 세트를 추가했을때 반응을안하더라구요..
이유가 궁금합니다..
DetailAdapter 내의 addItem()에서 세트를 추가할때마다 notifyDataSetChanged를 진행해주는데
이거는 반응을안하고 RoutineAdapter내에서 notify를 진행하면 오히려 업데이트되어 화면상에서도 바뀌더라구요
addItems하면서 하는 notifyDataSetChangede가 호출되어야하는게 맞는것 아닌가요?
어떻게하면 각 운동에대해서 따로 아이템을 추가할 수잇을까요?