간단한 ListView 최적화

2998 단어

최적화되지 않은 버전

    public class ExampleAdapter extends ArrayAdapter {
    
        int resourceId;
    
        public ExampleAdapter(Context context, int viewResource, ArrayList data) {
            super(context, viewResource, data);
            resourceId = viewResource;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent);
            TextView mTextVIew = (TextView)view.findViewById(R.id.text_view);
            Button mButton = (Button)view.findViewById(R.id.button);
            return view;
        }
    }

1. convertView 재사용

    @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            if(convertView == null) {
                view = LayoutInflater.from(getContext()).inflate(resourceId,parent);
            }else{
                view = convertView;
            }
           

            TextView mTextVIew = (TextView)view.findViewById(R.id.text_view);
            Button mButton = (Button)view.findViewById(R.id.button);            
            return view;
        }

convertView는 이전에 불러온 레이아웃을 캐시합니다. 만약 convert가null이 아니라면view를 직접 가져올 수 있습니다.따라서 레이아웃을 로드하는 LayoutInflater 횟수가 줄어듭니다.

2. ViewHolder 사용


ViewHolder 클래스를 정의하고 서브뷰를 저장하며 SparseArray 서브뷰의 id와 대응하는 뷰를 사용합니다. (최적화된 int-object의hashmap을 사용하면 메모리 손실을 줄일 수 있습니다.)이 서브뷰가 없는 경우 를 생성하여 SparseArray에 저장합니다.
    // 
    public class ViewHolder {
            private ViewHolder(){};
            public static  T get(View view, int id) {
                SparseArray viewHolder = (SparseArray) view.getTag();
                if (viewHolder == null) {
                    viewHolder = new SparseArray();
                    view.setTag(viewHolder);
                }
                View childView = viewHolder.get(id);
                if (childView == null) {
                    childView = view.findViewById(id);
                    viewHolder.put(id, childView);
                }
                return (T) childView;
            }
        }

getView의 쓰기
     @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Thing thing = getItem(position);
            View view;
            if(convertView == null) {
                view = LayoutInflater.from(getContext()).inflate(resourceId,parent);
    
            }else{
                view = convertView;
            }
            TextView mText = ViewHolder.get(View,R.id.text_view);
            Button button = ViewHolder.get(View,R.id.button)
            return view;
        }

쓰기 방법

3. RecyclerView를 사용하여 ListView의 업그레이드 버전입니다.

좋은 웹페이지 즐겨찾기