在安卓开发中我们经常会使用到listview,而在面试中我们也会经常会被问到listview的优化问题,让我帮他看一个问题就是listview中的问题
所以今天在这里写一下我在我的项目中listview的处理
在适配器中的getview方法我们常常会复用convertView 来降低oom的可能性.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Holder holder ;
if (convertView == null || null == convertView.getTag()) {
holder = new Holder();
HomeItemView itemview = new HomeItemView(context);
convertView = itemview.getView();
holder.itemView=itemview;
convertView.setTag(holder);
} else {
holder = (Holder) convertView.getTag();
}
final int finalPosition= position;
holder.itemView.setData(data.get(position));
convertView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, SearchResultActivity.class);
Bundle bundle = new Bundle();
bundle.putString(Constant.string.PARAMS_DATA, data.get(finalPosition).getName());
intent.putExtras(bundle);
context.startActivity(intent);
}
});
return convertView;
}
就像上面代码写的一样,但是我之前的做法是这样
convertView = LayoutInflater.from(context).inflate(R.layout.abc_action_bar_title_item, null);
但是这只是将整个item的布局打气出来,要想 获得item中的子view我们必须
convertView.findViewById(id);
而不是直接
findViewById(id);
这两者调用的对象就不一样,一个是在convertView上找 子view 一个是在 this上找view 在this上面找自己想找的view当然找不到最后只会报空指针了
在开发的过程中有我常遇到产品要求每个item长得比较好看 ,我觉得作为程序员看到一个需求第一反应都是比较懒,我上来就是想在布局文件上改,但是这种方法很多时候满足不了要求最终我都开始将item看成一个view对象,这样什么样的视图效果都能在代码中实现不多说上代码
class Holder{
HomeItemView itemView ;
}
package com.hichao.look.view;
import java.util.Random;
import com.hichao.look.LookApplication;
import com.hichao.look.R;
import com.hichao.look.api.model.ComponentHomeItem;
import com.hichao.look.util.CommonUtil;
import com.hichao.look.util.ImageUtil;
import com.hichao.look.util.Logger;
import com.hichao.look.util.UIUtil;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
@SuppressLint("NewApi")
public class HomeItemView extends LinearLayout {
private View view;
private FilletedCornerImageView imageView;
private RelativeLayout itemrl;
private ComponentHomeItem data;
private Context mContext;
private RectF rectF;
private Paint paint;
private float radius;
private float paintStrokeWidth;
private float padding;
private Random mRdm;
private TextView textName;
private TextView textTotal;
public HomeItemView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
mRdm = new Random();
view =inflate(context, R.layout.layout_home_item, this);
imageView = (FilletedCornerImageView) view.findViewById(R.id.home_item_iv);
itemrl = (RelativeLayout) view.findViewById(R.id.home_item_rl);
textName = (TextView) view.findViewById(R.id.home_item_tv_name);
textTotal = (TextView) view.findViewById(R.id.home_item_tv_total);
radius = UIUtil.dip2px(10);
paintStrokeWidth = UIUtil.dip2px(6);
padding = paintStrokeWidth / 2;
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(context.getResources().getColor(R.color.background_window));
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(paintStrokeWidth);
}
public HomeItemView(Context context) {
this(context, null);
}
public void setData(Object object){
this.data = (ComponentHomeItem)object;
textName.setText(data.getName());
textTotal.setText(data.getImage_total());
onMeasureDisPlayImg(data.getWidth(), data.getHeight(), imageView);
int red = 30 + mRdm.nextInt(208);
int green = 32 + mRdm.nextInt(208);
int blue = 32 + mRdm.nextInt(208);
int color = Color.rgb(red, green, blue);
imageView.setBackgroundColor(color);
ImageUtil.displayImage(data.getImage_url(), imageView);
}
public View getView(){
return view;
}
private void onMeasureDisPlayImg(String width,String height,ImageView disIV) {
float len = (LookApplication.getScreenWidth()-(int) getResources().getDimension(R.dimen.waterfall_child_margin)*4)/3;
float imgWidth = CommonUtil.getCountFloat(width);
float imgHeight = CommonUtil.getCountFloat(height);
int displayHeight =(int) Math.ceil((imgHeight/imgWidth)*len);
disIV.setLayoutParams(new LayoutParams((int)len, displayHeight));
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
rectF = new RectF(0 - padding, 0 - padding, getWidth() + padding, getHeight() + padding);
canvas.drawRoundRect(rectF, radius, radius, paint);
}
}
这样我的item成了一个带圆角的item ,由于item中的item也是自定义的带圆角的view所以并不会影响外部的整个item