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

recyclerView 에서 getItemCount 호출이 너무 많은거같아요.

0 추천

안녕하세요 

제가 RecyclerView를 구성하면서 살펴보니 getItemCount()가 왜 어려번 호출되는지 알수가 없어

질문 올려봅니다.

문제가 된 부분을 재현하기 위해 소스를 만들어 올려보겠습니다.

*MainActivity

 

private List<MemberDTO> member = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    member.add(new MemberDTO(R.drawable.img0001,"유재석","1인자"));


    RecyclerView view = findViewById(R.id.main_recyclerview);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
    MyRecyclerViewAdapter myRecyclerViewAdapter = new MyRecyclerViewAdapter();
    view.setLayoutManager(layoutManager);
    view.setAdapter(myRecyclerViewAdapter);

    myRecyclerViewAdapter.addView(member);

}

 

*RecyclerView

public class MyRecyclerViewAdapter  extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

    private List<MemberDTO> addItem;

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.default_items,parent,false);

        return new RowCell(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        RowCell item = (RowCell)holder;
        item.circleImageView.setImageResource(addItem.get(position).imageView);
        item.name.setText(addItem.get(position).name);
        item.message.setText(addItem.get(position).message);

    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemCount() {
        Log.i("TAG","count : ");
        return addItem.size();
    }

    private class RowCell extends RecyclerView.ViewHolder {
         CircleImageView circleImageView;
         TextView name;
         TextView message;
        private RowCell(View view) {
            super(view);
            circleImageView = view.findViewById(R.id.profile_image);
            name = view.findViewById(R.id.name);
            message = view.findViewById(R.id.message);
        }
    }

    public void addView(List<MemberDTO> _addItem){
        addItem = _addItem;
        this.notifyDataSetChanged();
    }
}

 

제가 이해한 RecyclerView를 재구성해본 소스입니다.

메인에서 만들어진 데이터를 addView 메소드를 통해 전달하고

데이터가 전달되면 getItemCount()가 데이터의 크기를 가지고 BindViewHolder를 그만큼 작동시킨다 정도로 이해하고있습니다.

 

getItemCount() 어디서 어떻게 호출되는지를 모르니;; 

왜 1개의 데이터를 가지고 count()를 11번이나 호출해야하는지 감을 못잡겠네요.

11번이나 호출은 되지만 onBindViewHolder는 1번만 호출됩니다;;

 

이렇게 이해한 상태에서 만들어진 앱에서는 출력은 원하는대로 잘 되긴합니다.

그런데 저렇게 이해할수없는 많은 횟수의 호출이 분명 문제가 되지 않을까 생각이 들더라고요.

nickeun (540 포인트) 님이 2018년 5월 18일 질문
이러 저리 찾아본 내용은
getItemCount가 데이터가 전달되고 notify가 실행될때만 호출 되는게 아니라
다른 이벤트에도 반응을 하는가봐요? 일단 화면을 구성하는 bindViewholder는
전달 받은 값의 사이즈 만큼 화면에 구성이 되야할 요소에서 재구성은 잘 되는데

getItemCount가 작동할때만 작동이 되야는거 아닌가 싶었거든요...

그런데 로그를 살표보니 스크롤이 작동되면 계속 호출 되더라고요;; 또 호출이
이뤄졌다해서 그게 다 bindViewHolder가 작동되는것도 아니고요.

getItemCount에서 처리 과정이 필요하다면 오버라이딩해서 재구성 하든가
bindViewHolder가 정상 작동되는 범위 안에서는 별도로 크게 신경쓰지 않아도
되는건가? 싶기도 하면서 궁금중만 생기네요 ^^;

혹시 제가 놓치고 있는 부분이나 잘못 이해하고 있는 부분이 있다면 한 수 가르침
부탁드립니다~ ~~
아마 layoutmanager에서 내부적으로 계속 호출될거에요.
전혀 신경쓰지 않으셔도 됩니다.
소중한 댓글 감사합니다. ^^
혹시 저의 부족함으로 뭘 모르고 넘어가는가 궁금했거든요

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...