简单的ListView优化

未优化版本

    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类,存储子View,使用SparseArray存储子View的id和其对应的View(此处使用了优化过的int-object的hashmap, 可以减少内存损耗)。使用时若不存在此子View,便创建,并存入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的升级版。

你可能感兴趣的:(简单的ListView优化)