现在的位置: 首页 > 综合 > 正文

ViewHolder的妙用

2017年12月17日 ⁄ 综合 ⁄ 共 2725字 ⁄ 字号 评论关闭

private static class EfficientAdapter extends BaseAdapter { 
        private LayoutInflater mInflater; 
        private Bitmap mIcon0; 
        private Bitmap mIcon1; 
…  … 
        public EfficientAdapter(Context context) { 
            mInflater = LayoutInflater.from(context); 
            mIcon0 = BitmapFactory.decodeResource(context.getResources(), R.drawable.noicon); 
            mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.beijing); 
…   … 
      } 

        public int getCount() { 
            return DATA.length; 
        } 

        public Object getItem(int position) { 
            return DATA[position]; 
        } 

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

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

            if (convertView == null) { 
                convertView = mInflater.inflate(R.layout.main, null); 

                holder = new ViewHolder(); 
                holder.text = (TextView) convertView.findViewById(R.id.textview); 
                holder.icon = (ImageView) convertView.findViewById(R.id.icon); 

                convertView.setTag(holder); 
            } else { 
                holder = (ViewHolder) convertView.getTag(); 
            } 

            holder.text.setText(DATA[position]); 
            switch(position) 
            { 
            case 0: 
            holder.icon.setImageBitmap(mIcon1); 
            break; 
            case 1: 
            holder.icon.setImageBitmap(mIcon2); 
            break; 
          … 
            default: 
            holder.icon.setImageBitmap(mIcon0); 
            break; 
            } 
            

            return convertView; 
        } 

        static class ViewHolder { 
            TextView text; 
            ImageView icon; 
        } 
    } 
编写自定义Adapter可以继承BaseAdapter类,如果是数据库使用可以继承CursorAdapter。在本例中继承了BaseAdapter类,BaseAdapter是一个抽象类,必须在它的子类中实现下面的方法: 
int getCount() 返回总数据源中总的记录数; 
Object getItem(int position) 根据选择的项目的位置,获得选择的数据源中某个项目的数据; 
long getItemId(int position) 根据选择的项目的位置; 
View getView(int position, View convertView, ViewGroup parent) 获得要展示的项目View对象。 
这里最为麻烦的方法就是getView(),getView()方法是ListView的每个列表项目绘制在屏幕上时被调用。该方法其中的一个参数是convertView,在ListView第一次显示列表项目的时候,convertView是null值。当向上滑动屏幕时候,屏幕上面的列表项目退出屏幕,屏幕下面原来不可见的列表项目会进入屏幕,这个时候的convertView不是null值,下面代码的处理对于提供ListView控件提高性能是至关重要的。 
if (convertView == null) { 
convertView = mInflater.inflate(R.layout.main, null); 

holder = new ViewHolder(); 
holder.text = (TextView) convertView 
.findViewById(R.id.textview); 
holder.icon = (ImageView) convertView.findViewById(R.id.icon); 

convertView.setTag(holder); 
} else { 
holder = (ViewHolder) convertView.getTag(); 

只有在convertView为null时才去实例化控件,创建convertView对象、holder对象,其中convertView对象是通过mInflater.inflate(R.layout.main, null)方法,从一个main.xml布局文件中加载并创建的。 
而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目很多时,用户反复滑动屏幕会有“卡”的感觉,不再流畅了。 
ViewHolder类是将每一个项目中的控件封装起来的类,可以在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类的实例,这样在翻屏的时候就不会反复创建ViewHolder实例对象了,

抱歉!评论已关闭.