listview的adapter中的一些问题



在安卓开发中我们经常会使用到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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值