一、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