부스터코스 프로젝트 진행하며 공부중인 초보자입니다.
앱 구현할때 리스트뷰가 필요한데 스크롤뷰안에 넣으면 아이템이 하나밖에 안보이는 현상이 발생하더라구요.
이것때문에 근본적으로는 해결하지 못하고 그냥 리사이클러뷰로 싹 갈았더니 잘되네요!
근데 별개로 리사이클러뷰의 데이터 설정 시점에 질문좀 드리겠습니다.
아래는 먼저 코드입니다.
public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> {
ArrayList<ListItem> items = new ArrayList<>();
public void addItem(ListItem item) {
items.add(item);
}
public void setItems(ArrayList<ListItem> items) {
this.items = items;
}
// position번째 아이템 리턴
public ListItem getItem(int position) {
return items.get(position);
}
public void setItem(int position, ListItem item) {
items.set(position, item);
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
// 뷰홀더를 생성시점에 자동호출 메소드
// 각각의 아이템을 위한 레이아웃을 인플레이션 후 뷰홀더에 넣어서 뷰홀더를 리턴하면 하나의 아이템을 위한 뷰홀더가 만들어져서 리턴됨
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.list_item,parent,false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
// 뷰홀더 재사용위한 메소드
ListItem item = items.get(position);
holder.setItem(item);
}
@Override
public int getItemCount() {
return items.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
ImageView profile; // 프로필 사진
TextView name; // 이름(아이디)
RatingBar score; // 평점
TextView comment; // 한줄평 내용
TextView time; // 작성시간
public ViewHolder(View itemView) {
super(itemView);
profile = itemView.findViewById(R.id.profile);
name = itemView.findViewById(R.id.name);
comment = itemView.findViewById(R.id.comment);
score = itemView.findViewById(R.id.score);
time = itemView.findViewById(R.id.time);
}
// onBindViewHolder()에서 재사용되는 뷰홀더 데이터 설정할때 쓰는 것
public void setItem(ListItem item) {
name.setText(item.getName());
comment.setText(item.getComment());
time.setText(item.getTime());
}
}
}
어댑터 클래스입니다.
LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
ItemAdapter adapter = new ItemAdapter();
adapter.addItem(new ListItem("테스트1","가나다라마바사1","10분전"));
adapter.addItem(new ListItem("테스트2","가나다라마바사2","13분전"));
adapter.addItem(new ListItem("테스트3**","가나다라마바사3","14분전"));
adapter.addItem(new ListItem("테스트4**","가나다라마바사4","15분전"));
adapter.addItem(new ListItem("테스트5**","가나다라마바사5","15분전"));
adapter.addItem(new ListItem("테스트6**","가나다라마바사6","15분전"));
adapter.addItem(new ListItem("테스트7**","가나다라마바사7","15분전"));
adapter.addItem(new ListItem("테스트8**","가나다라마바사8","15분전"));
adapter.addItem(new ListItem("테스트9**","가나다라마바사9","15분전"));
recyclerView.setAdapter(adapter);
메인액티비티에서 리사이클러뷰 생성하고 아이템 생성 및 어댑터 설정입니다.
제가 궁금한것은 아이템의 데이터 설정 시점이 언제인가? 입니다.
메인액티비티에서 어댑터의 add()를 이용해서 아이템을 추가합니다. 여기서 파라미터(아이템)는 이제
보시다시피 ArrayList로 추가가 되겠지요.
여기까지는 이해를 했는데, 이 추가된 아이템의 정보(데이터)가 언제 뷰에 셋팅이 되는지 모르겠습니다.
그러니까 각 아이템의 테스트1, 테스트2 테스트3 이러한 데이터가 언제 각 뷰에 설정이 되는지 잘모르겠습니
다.
ViewHolder 클래스 내부에 setItem 이라고 아이템의 데이터를 설정하는게 있긴한데 제가 영상에서 듣기를
onBindViewHolder()에서 재사용되는 뷰홀더 데이터를 설정할때 쓰는것이라고 하더군요.
그렇다면 맨~~처음에는 저런 ViewHolder클래스 내부의 setItem()같은 메소드가 정의되어있지도 않는데
어떻게 데이터를 설정하나요?
혹시 onBindViewHolder에서 실행되는 setItem()이 재사용뿐만아니라
맨처음 시작할때도 설정되는 것인가요?
또한
// ArrayList 전체를 설정?
public void setItems(ArrayList<ListItem> items) {
this.items = items;
}
// position번째 아이템 리턴
public ListItem getItem(int position) {
return items.get(position);
}
public void setItem(int position, ListItem item) {
items.set(position, item);
}
어댑터 클래스에 정의된 이 세가지 메소드는 필요성이 뭔가요? 영상에서 하길래 따라쓰기는 했는데
메소드도 전혀 쓰이는 곳도 없고.. 주석처리하고 실행해봐도 문제없이 실행이 되네요..--
질문도 길고 글도 길지만 답변해주시면 감사하겠습니다!