안드로이드

안드로이드 리스트 뷰 뷰 홀더 android listView ViewHolder

알통몬_ 2017. 3. 18. 16:54
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

이번 포스팅에서는 리스트 뷰 뷰홀더 ListView ViewHolder 패턴의 사용 이유와 사용방법에 대해 알아보겠습니다.


뷰홀더(ViewHolder)는 리스트 뷰의 유연한 동작을 위해서 나왔습니다.

예를 들어보면 리스트가 10000개가 있다고 할 때

한 리스트에 TextView가 2개씩 있다고 하면

TextView 생성을 위해 매번 findViewById()를 호출해야하고

10000번 호출된다고 하면 엄청난 오버해드를 불러오고 스크롤을 내릴 때마다

반응 속도가 느려지겠죠?


이런 오버 해드와 느린 반응 속도의 해결을 위해 

뷰홀더(ViewHolder) 가 나오게 되었습니다.

뷰홀더 패턴의 원리 >>

각 View 객체를 ViewHolder에 고정시키는 건데요.

이런 방법이 리스트 뷰의 성능 개선에 도움을 준다고 하네요~~


사용 벙법 >>

먼저 뷰홀더 클래스를 생성해야 하는데요.

어댑터 클래스에 내부 클래스로 작성해도 되고

별도의 클래스로 작성해도 됩니다.

어댑터 클래스 예제


 


public class SampleAdapter extends BaseAdapter {

    private Vector<User> user; // 넣고자 하는 아이템의 값들

    private LayoutInflater layoutInflater;


    public SampleAdapter(Context context, Vector<User> user, LayoutInflater layoutInflater) {

        this.user = user;

        this.layoutInflater = layoutInflater;

    }


    // ViewHolder

    private class ViewHolder {

        private TextView textView;

        private TextView msgCountTextView;

    }


    @Override

    public int getCount() {

        return user.size();

    }


    @Override

    public Object getItem(int i) {

        return user.get(i);

    }


    @Override

    public long getItemId(int i) {

        return i;

    }


    @Override

    public View getView(int position, View convertView, ViewGroup parent) {

       //ViewHolder 사용 방법

        ViewHolder viewHolder;

        if (convertView == null) {

            convertView = layoutInflater.inflate(R.layout.employee_row, null);

            viewHolder = new ViewHolder();

            viewHolder.textView = (TextView) convertView.findViewById(R.id.employeeId);

            viewHolder.msgCountTextView = 

           (TextView)  convertView.findViewById(R.id.msgCountTextView);

            convertView.setTa g(viewHolder);

        } else {

            viewHolder = (ViewHolder) convertView.getTag();

        }

        String subject = user.get(position).getName();

        viewHolder.textView.setText(subject);

        int count = user.get(position).getCount();

        if (count == 0) {

            viewHolder.msgCountTextView.setText("");

            viewHolder.msgCountTextView.setBackgroundResource(0);

        } else {

            viewHolder.msgCountTextView.setText(String.valueOf(count));

            viewHolder.msgCountTextView.setBackgroundResource(R.drawable.chat_count);

        }

        return convertView;

    }

}




// 위 코드에서 주의하실 점은

if(convertView == null) {

} else {

문 이후에 

각 View들에 값을 대입해야 순서가 뒤죽박죽 되지않고

제대로 동작합니다.

저도 처음 사용할 때 

if(convertView == null) {}

안에 View에 값들어 저장했다가

순서가 제대로 뒤죽박죽이 되는 것을 경험했습니다.

꼭 주의하세요 ~

그 외의 리스트 아이템을 적용시킨 다거나 하는 부분, Acitivty에서 setAdapter 하는 부분은

기존 리스트 뷰 사용법과 같습니다~~

이상입니다.


위 예제의 결과는 아니고 제가 따로 뷰홀더 패턴을 사용해 리스트 뷰를 만들어 보았는데요.

그 결과 입니다 ㅎㅎ



반응형