Android简单开发之 通用Adapter ViewHolder

我们寻常使用Adapter的方式

public class BusbaseSearchApadter extends SimpleBaseApadter {

	private List<Busbase> busbases = new ArrayList<Busbase>();
	public Context context;
	public void setList(List<Busbase> busbases) {
		this.busbases = busbases;
	}

	public BusbaseSearchApadter(Context context) {
		super(context);
		this.context = context;
	}

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

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Busbase busbase = busbases.get(position);
		ViewHolder holder = null;
		if(convertView == null){
			holder = new ViewHolder();
			convertView = LayoutInflater.from(context).inflate(R.layout.hx_item_search_bus, parent, false);
			holder.hx_item_bus_search_image = (ImageView)convertView.findViewById(R.id.hx_item_bus_search_image);
			holder.hx_item_bus_search_name = (TextView)convertView.findViewById(R.id.hx_item_bus_search_name);
			holder.hx_item_bus_search_mobile = (TextView)convertView.findViewById(R.id.hx_item_bus_search_mobile);
			convertView.setTag(holder);
		}else{
			holder = (ViewHolder)convertView .getTag();
		}
		bitmapUtils.display(holder.hx_item_bus_search_image, busbase.getShopLogo());
		holder.hx_item_bus_search_name.setText(busbase.name);
		holder.hx_item_bus_search_mobile.setText(busbase.mobile);
		return convertView;
	}

	class ViewHolder{
		ImageView hx_item_bus_search_image;
		TextView hx_item_bus_search_name;
		TextView hx_item_bus_search_mobile;
	}

能够看出当中  实用的代码仅仅有仅仅有getView  和ViewHolder  可是其它的代码又不得不写,太痛苦 了不得不反复的写无数adapter 和ViewHoder.

我们能够写一个通用的ViewHolder

public class ViewHolder {
	private final SparseArray<View> mViews;
    private int mPosition;
    private View mConvertView;
    protected BitmapUtils bitmapUtils;

    private ViewHolder(Context context, ViewGroup parent, int layoutId,
            int position)
    {
    	bitmapUtils = new BitmapUtils(context);
		bitmapUtils.configDefaultLoadingImage(R.drawable.hx_loodding);
		bitmapUtils.configDefaultLoadFailedImage(R.drawable.hx_loodding);
		bitmapUtils.configDefaultBitmapConfig(Bitmap.Config.RGB_565);
        this.mPosition = position;
        this.mViews = new SparseArray<View>();
        mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
                false);
        // setTag
        mConvertView.setTag(this);
    }  

    /**
     * 拿到一个ViewHolder对象
     *
     * @param context
     * @param convertView
     * @param parent
     * @param layoutId
     * @param position
     * @return
     */
    public static ViewHolder get(Context context, View convertView,
            ViewGroup parent, int layoutId, int position)
    {
        if (convertView == null)
        {
            return new ViewHolder(context, parent, layoutId, position);
        }
        return (ViewHolder) convertView.getTag();
    }  

    public View getConvertView()
    {
        return mConvertView;
    }  

    /**
     * 通过控件的Id获取对于的控件,假设没有则增加views
     *
     * @param viewId
     * @return
     */
    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;
    }  

    /**
     * 为TextView设置字符串
     *
     * @param viewId
     * @param text
     * @return
     */
    public ViewHolder setText(int viewId, String text)
    {
        TextView view = getView(viewId);
        view.setText(text);
        return this;
    }  

    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param drawableId
     * @return
     */
    public ViewHolder setImageResource(int viewId, int drawableId)
    {
        ImageView view = getView(viewId);
        view.setImageResource(drawableId);  

        return this;
    }  

    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param drawableId
     * @return
     */
    public ViewHolder setImageBitmap(int viewId, Bitmap bm)
    {
        ImageView view = getView(viewId);
        view.setImageBitmap(bm);
        return this;
    }  

    /**
     * 为ImageView设置图片
     *
     * @param viewId
     * @param drawableId
     * @return
     */
    public ViewHolder setImageByUrl(int viewId, String url)
    {
    	bitmapUtils.display((ImageView) getView(viewId), url);
        return this;
    }  

    public int getPosition()
    {
        return mPosition;
    }

使用一个SparseArray将View存起来

如今Adapter这样写

public abstract class AbstuctBaseApadter<T> extends SimpleBaseApadter {

	protected LayoutInflater mInflater;
	protected Context mContext;
	protected List<T> mDatas;
	protected int mItemLayoutId;
	public AbstuctBaseApadter(Context context) {
		super(context);
	}

    public AbstuctBaseApadter(Context context, List<T> mDatas, int itemLayoutId)
    {
    	this(context);
        this.mContext = context;
        this.mInflater = LayoutInflater.from(mContext);
        this.mDatas = mDatas;
        this.mItemLayoutId = itemLayoutId;
    }  

    public void setList(List<T> mDatas){
    	 this.mDatas = mDatas;
    }

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

    @Override
    public T getItem(int position)
    {
        return mDatas.get(position);
    }  

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        final ViewHolder viewHolder = getViewHolder(position, convertView,
                parent);
        convert(viewHolder, getItem(position));
        return viewHolder.getConvertView();  

    }  

    public abstract void convert(ViewHolder helper, T item);  

    private ViewHolder getViewHolder(int position, View convertView,
            ViewGroup parent)
    {
        return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,
                position);
    }

如今我们仅仅须要重写 convert方法  看activity里面怎么使用

		AbstuctBaseApadter abstuctBaseApadter = new AbstuctBaseApadter<Map<String,Object>>(activity,list_map,R.layout.hx_money_item) {
			public void convert(ViewHolder helper, Map<String, Object> item) {
				helper.setText(R.id.id_item_1, item.get("time").toString());
				helper.setText(R.id.id_item_3, item.get("sourcename").toString());
			}
		};

直接在activity里面写匿名内部类就能够了

哈哈  打工改成

时间: 2025-01-07 09:26:43

Android简单开发之 通用Adapter ViewHolder的相关文章

Android安全开发之启动私有组件漏洞浅谈

0x00 私有组件浅谈 android应用中,如果某个组件对外导出,那么这个组件就是一个攻击面.很有可能就存在很多问题,因为攻击者可以以各种方式对该组件进行测试攻击.但是开发者不一定所有的安全问题都能考虑全面. ? 对于这样的问题,最方便的修复方式就是在确定不影响业务的情况下,将这个存在问题的组件不对外导出变成私有组件.这样做的确很有效,私有组件也很安全.但是,如果存在某个私有组件能被导出组件启动的话,那么这个私有组件其实就不再是私有了.如果攻击者可以通过控制导出的组件对私有组件进行控制,那么攻

Android中适用于ListView、GridView等组件的通用Adapter

今天随便逛逛CSDN,看到主页上推荐了一篇文章Android 快速开发系列 打造万能的ListView GridView 适配器,刚好这两天写项目自己也封装了类似的CommonAdapter,以前也在github上看到过这样的库,于是自己也把自己的代码再次整理出来与大家分享,也希望能够在CSDN这个平台上学到更多的东西,下面就一起来看看吧. 平时我们在项目中使用到ListView和GridView组件都是都会用到Adapter,比较多的情况是继承自BaseAdapter,然后实现getCount

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载) POSTED ON 2014年6月27日 BY 天边的星星 本文内容: 1.横向ListView的所有实现思路; 2.其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册: 3.实现的横向ListView在点击.浏览时item背景会变色,并解决了listview里setSelected造成item的选择状态混乱的问题.

Android项目开发全程(二)--Afinal用法简单介绍

本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目中用到的几个功能: Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题. Af

Android开发教程--关于Adapter的The content of the adapter has changed问题分析

我们在做android list开发的时候,有时候会遇到类似这样的问题: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from th

android应用开发全程实录-你有多熟悉listview

http://blog.csdn.net/notice520/article/details/7040962 今天给大家带来<android应用开发全程实录>中关于listview和adatper中的部分.包括listview的基本使用,listview的优化等. 我们经常会在应用程序中使用列表的形式来展现一些内容,所以学好ListView是非常必需的.ListView也是Android中比较难以使用的控件,这节内容就将详细解读ListView的用法. 一个ListView通常有两个职责. (

【转】android应用开发全程实录-你有多熟悉listview?---不错

原文网址:http://www.cnblogs.com/noTice520/archive/2011/12/05/2276379.html 今天给大家带来<android应用开发全程实录>中关于listview和adatper中的部分.包括listview的基本使用,listview的优化等. 我们经常会在应用程序中使用列表的形式来展现一些内容,所以学好ListView是非常必需的.ListView也是Android中比较难以使用的控件,这节内容就将详细解读ListView的用法. 一个Lis

上门洗车APP --- Android客户端开发 之 项目结构介绍

上门洗车APP --- Android客户端开发 之 项目结构介绍 前言 虽然公司项目较紧,但还是抽出时间给大家继续更新.     o_O"~ 感谢大家的关注,很高兴和大家共同学习.前面给大家分享了项目中的以下内容: 上门洗车APP --- Android客户端开发 前言及业务简介 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(二) 之前有很多朋友私信过来说想打包一份源码学习,由于本项目也是还

Android艺术开发探索第三章————View的事件体系(下)

Android艺术开发探索第三章----View的事件体系(下) 在这里就能学习到很多,主要还是对View的事件分发做一个体系的了解 一.View的事件分发 上篇大致的说了一下View的基础知识和滑动,现在我们再来聊聊一个比较核心的知识点,那就是事件分发了,而且他还是一个难点,我们更加应该掌握,View的滑动冲突一直都是很苦恼的,这里,我们就来一起探索一下 1.点击事件的传递规则 我们分析的点击事件可不是View.OnClickListener,而是我们MotionEvent,即点击事件,关于M