几种adapter的加载优化方式

滴水穿石

在动手之前脑中从头到尾过几次,然后下手时自然顺畅,而且对进度的把握也能更加明了。

加载优化方式

今天在bugly突然看到有一个oom的crash,然后查看之后发现某个地方少了点优化,综合之前做的几种,就在这里统一整理一下。

1.继承BaseAdapter.

这里是需要重写几个方法:

@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return list.get(position);
}

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {}
本来按照之前的优化,只在getView里面判断null==convertview,如果为空则重新inflate,忘记tag重用了,现在优化后是这样的。

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    Holder holder ;
    if (null==convertView) {
        holder=new Holder();
        convertView = ((Activity) _context).getLayoutInflater().inflate(R.layout.list, null);
        holder.textView=(TextView)convertView.findViewById(R.id.item_name);
        holder.imageView=(ImageView)convertView.findViewById(R.id.img);
        convertView.setTag(holder);
    }else{
        holder=(Holder)convertView.getTag();
    }
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(DeviceInfo.getScreenWidth(_context),DeviceInfo.getScreenWidth(_context));//删掉了某些宽高比例
    holder.imageView.setLayoutParams(params);
    if(SystemConfig.getCityInHashmap(list.get(position).getName())==0){
        ImageLoader.getInstance().displayImage("drawable://default.png"), holder.imageView, _options);
    }else{
        ImageLoader.getInstance().displayImage("drawable://xx.png"), holder.imageView, _options);
    }
    holder.textView.setText(list.get(position).getName());
    return convertView;
}

public class Holder{
    TextView textView;
    ImageView imageView;
}
这样的话就不用大量的产生imageview了。

第二种:继承RecyclerView.Adapter,这里Holder加入到了方法里面。

public class ViewHolder extends RecyclerView.ViewHolder{
    TextView textView;
    public ViewHolder(View itemView) {
        super(itemView);
        textView=(TextView)itemView.findViewById(R.id.item_info);
    }
}

这里这个ViewHolder需要继承系统RecyclerVIew.ViewHolder,但是大家看到上面没有,继承的adapter是适配的当前adapter的ViewHolder,其他的地方大同小异了。实现父类方法

@Override
public int getItemCount() {
    return list.size();
}
 
  
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {}
 
  
 
  
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {}


只是这个时候我们只需在onCreateViewHolder里面进行控件的绑定。

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = mLayoutInflater.inflate(R.layout.item_home, parent, false);
    ViewHolder viewHolder = new ViewHolder(view);
    viewHolder.mLinearLayout=(LinearLayout)view.findViewById(R.id.item);}

然后在onBindViewHolder里面使用holder.xxx即可。

3.继承PagerAdapter,也是实现父类方法,然后具体操作基本看方法名也知道该怎么做了,只不过我这边将那个实体类放到了外面,方便其他的重用,这里就不贴出来了。

目前项目中就用到了这几种简单的,欢迎大家提出不适之处。有相互学习的朋友加QQ一起学习呗:125642014. ~_~





你可能感兴趣的:(成长)