ListView优化

    xiaoxiao2026-01-01  0

    一、Adapter优化 ListView加载数据在public View getView(int position, View convertView, ViewGroup parent) {}方法中进行的 1、利用了ListView的缓存特性 ListView中的View需要时才显示,显示完就被回收到缓冲池中。利用了ListView的缓存特性,先判断convertView是否为空,不为空则表示已经加载过了存在于缓冲池中,View缓冲池中取出,并重新设置好该view所要显示的数据若没有缓存才创建新的View。 2利用ViewHolder模式提高效率 每次调用getView() 中的findViewById()会浪费大量时间; ViewHolder模式避免了每次在调用getView()的时候都去通过findVIewById()实例控件。使用ViewHolder模式来优化ListView,只需要在自定义Adapter中定义一个内部类ViewHolder ,并将布局中的控件作为成员变量。 代码如下: public View getView( int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null ) { holder=new ViewHolder(); convertView=mInflater.inflate(R.layout.item,null); holder.imageView = (ImageView) convertView.findViewById(R.id.image); holder.name = (TextView) convertView.findViewById(R.id.name); holder.content = (TextView) convertView.findViewById(R.id.content); holder.time = (TextView) convertView.findViewById(R.id.time); convertView.setTag(holder); } else { holder= (ViewHolder) convertView.getTag(); } ItemBean bean=mData .get(position); holder.imageView .setImageResource(bean.getImageId()); holder.name.setText(bean.getName()); holder.content .setText(bean.getContent()); holder.time.setText(bean.getTime()); return convertView; } class ViewHolder{ public ImageView imageView ; public TextView name ; public TextView content ; public TextView time ; } 二、打造通用适配器 1、封装ViewHolder 通用ViewHolder编写,封装一个新的可通用的ViewHolder。 新建一个ViewHolder类,使用SparseArray<View>来存储控件。在ViewHolder中我们要完成之前的这部分代码的相同功能 if (convertView == null ) { holder=new ViewHolder(); convertView=mInflater.inflate(R.layout.item,null); holder.imageView = (ImageView) convertView.findViewById(R.id.image); holder.name = (TextView) convertView.findViewById(R.id.name); holder.content = (TextView) convertView.findViewById(R.id.content); holder.time = (TextView) convertView.findViewById(R.id.time); convertView.setTag(holder); } else { holder= (ViewHolder) convertView.getTag(); } 1、写一个可以在Adapter中返回ViewHolder 的方法。先判断convertView是否有缓存,没缓存就构造ViewHolder public static ViewHolder get( Context context,View convertView, ViewGroup parent,int ResourseId, int position){ if(convertView==null ){ return new ViewHolder(context,parent,ResourseId,position); } else { return (ViewHolder) convertView.getTag(); } }  2、重写ViewHolder的构造方法 public ViewHolder(Context context, ViewGroup parent, int ResourseId, int position){ this.mPosition =position; mViews=new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(ResourseId,parent, false); mConvertView .setTag(this); } 3、获取控件对象 public < T extends View> T getView(int viewId){ View view=mViews .get(viewId); if(view==null ){ view=mConvertView .findViewById(viewId); mViews .put(viewId,view); } return (T) view; } 检验成果,与Adapter相结合,将getView()方法重写为 public View getView( int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.get( context, convertView, parent, R.layout. item, position); ItemBean bean = mData .get(position); ImageView image = holder.getView(R.id.image); TextView name = holder.getView(R.id.name); TextView content = holder.getView(R.id.content); TextView time = holder.getView(R.id.time); image.setImageResource(bean.getImageId()); name.setText(bean.getName()); content.setText(bean.getContent()); time.setText(bean.getTime()); return holder.getmConvertView(); } 2、通用Adapter编写 写一个CommonAdapter类,继承BaseAdapter,将重复的部分封装起来,因为要适用不同的数据类型这里用到了泛型。getView()的方法每个实现类都不一样所以将它封装成一个Abstract的抽象方法共子类实现。因为父类成员需要被子类成员访问所以将其申明为protected. <pre name="code" class="java">public abstract class CommonAdapter<T > extends BaseAdapter { protected Context context ; protected List<T > mData; protected LayoutInflater mInflater ; public CommonAdapter(Context context, List<T > mData) { this .context = context; this .mData = mData; mInflater =LayoutInflater.from(context); } public int getCount() { return mData.size(); } public Object getItem(int position) { return mData.get(position); } public long getItemId(int position) { return position; } public abstract View getView(int position, View convertView, ViewGroup parent) ; }
    转载请注明原文地址: https://ju.6miu.com/read-1305545.html
    最新回复(0)