마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리사이클러뷰 피드백 보안입니다.

0 추천

조언해주신대로 코드를 수정해보았는데요... 여전히 원글에 올린 사진처럼 해결이 되지 않네요 ㅠㅠ..

    /**
     * position에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시.
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(@NonNull HealthFirstRecyclerViewAdapter.ViewHolder holder, int position) {
        Routine item = routines.get(position);

        holder.exerciseText.setText(item.getExerciseText());
        holder.addBtn.setText("추가");

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(holder.itemView.getContext());
        holder.getRecyclerView().setLayoutManager(linearLayoutManager);

        holder.getButton().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addSets(holder, item);
            }
        });
    }

    public void addSets(ViewHolder holder, Routine routine) {
        SetsList newSetsList = new SetsList(String.valueOf(setIndex++ +1) + "set", 0 + "kg", 0 + "reps");
        setsLists.add(newSetsList);
        updateRoutine(routine);
    }

    public void updateRoutine(Routine routine) {
        int index = this.routines.indexOf(routine);
        if(index < 0) throw new NoSuchElementException("Cannot find routine");
        this.routines.set(index, routine);
        notifyItemChanged(index);
    }

 

매력적인수박 (670 포인트) 님이 2021년 7월 27일 질문

1개의 답변

0 추천
public void addSets(ViewHolder holder, Routine routine) {
    SetsList newSetsList = new SetsList(String.valueOf(setIndex++ +1) + "set", 0 + "kg", 0 + "reps");
    setsLists.add(newSetsList);
    // routine의 자식 아이템을 업데이트 하는 부분이 안보여요. routine.setItems(setsLists)
    updateRoutine(routine);
}

// ViewHolder는 사용하지 않으므로 삭제하세요. 그럼 아래처럼 되겠죠.
public void addSets(Routine routine) {

}
 
public void updateRoutine(Routine routine) {
    int index = this.routines.indexOf(routine);
    if(index < 0) throw new NoSuchElementException("Cannot find routine");
    
    this.routines.set(index, routine);
    notifyItemChanged(index);
}

 

addSets를 보시면 결국 어댑터 안에 있을 필요가 없는 메소드입니다. 다시 한번 말씀 드리지만, 어댑터의 역할과 데이터를 추가하는 역할에 대해서 구분을 명확하게 하시는게 좋아요. 어댑터는 리스트 아이템 추가하는 일에 관여할 필요가 없는 클래스입니다. 화면에 주어진 데이터로 잘 보여주기만 하면 되는 게 본래의 역할입니다. 

그리고 뷰홀더의 내부를 onViewBindHolder 에서 조작하는 것도 마찬가지로 좋지 않습니다. 어댑터는 ViewHolder의 내부가 어떻게 구성되는지 알 필요도 없고 알지 않는 것이 OOP의 구조상 바람직합니다.  이건 내가 다른 사람의 은행 계좌에 송금을 하기 위해서 은행시스템에서 트랙잭션이 어떻게 처리되는지 알아야 하는 것과 비슷합니다. 뷰홀더의 일은 뷰홀더에게 맡기세요.

자기 역할이 아닌 코드는 해당 역할을 하는 쪽으로 옮기는게 좋습니다.

 

 

spark (225,780 포인트) 님이 2021년 7월 28일 답변
spark님이 2021년 7월 28일 수정
리사이클러뷰 관련 피드백2
...