Android SparseArray用法详解

传统的通过定义对象,运用面向对象的封装特性,实现视图的缓存,这里使用一种快速而便捷的缓存方式——SparseArray,此数据结构是通过Key和Value的index实现的,无论查询和插入效率,比HashMap高很多,缺点是key必须是int类型。

1.使用Sparse代理传统的ViewHolder的实现方法

/**
	 * 构建ViewHolder,并且返回所需要查找的View,需要的便会加载,不需要的不加载,效率更高
	 * @param layoutView 主布局
	 * @param childId 子View
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T extends View> T injectViewHolder(View layoutView,int childId){
		
		SparseArray<T> sparseArray = (SparseArray<T>) layoutView.getTag();
		if(sparseArray==null)
		{
			sparseArray = new SparseArray<T>();
			layoutView.setTag(sparseArray);
		}
		T t = sparseArray.get(childId);
		if(t!=null)
		{
			return t;
		}

        t = (T) layoutView.findViewById(childId);
		if(t!=null)
		{
				sparseArray.put(childId, t);
		}

		return t;
	}

2.SparseArray存储和查找View的方法

View convertView = LayoutInflater.from(context).inflate(R.layout.list_card_item,null); 
TextView flightDateTv = injectViewHolder(convertView, R.id.card_item_flightdate_tv);
TextView routeTv = injectViewHolder(convertView, R.id.card_item_route_tv);

这种同样可以实现ViewHolder而且SparseArray是个高速读取的数组,效率比Map好多了。

 

3.SparseArray的重要API

    //根据Key值获取value
    public E get(int key);
    //根据Key值获取value,valueIfKeyNotFound表示value未找到或者key未映射时座位替代的value
    public E get(int key, E valueIfKeyNotFound);
    //删除
    delete(int key);
    //,底层调用了delete(int key)
    remove(int key);
    //按照索引删除
    public void removeAt(int index);
    //插入key=>value
    public void put(int key, E value);
    //数组大小
    public int size();
    //key所在的索引
    public int indexOfValue(E value);
    //索引对应的key
    public int keyAt(int index);
    //value所在的索引
    public int indexOfValue(E value);
    //索引对应的key
    public E valueAt(int index);

在SparseArray中,分别利用来做键值映射,这点比使用数组和链表的HashMap效率高很多。

    private int[] mKeys;
    private Object[] mValues;
    private int mSize;

在这里可知: key=>value所构成的映射中,他们的索index是完全相同的,即知道value,可通过indexOfValue->keyAt得到key值,也可以通过索引得到 key和value

SparseArray因此具有LinkedList的特性,无序性,也具有Map的特性,键值映射

 

Try doing it!

转载于:https://my.oschina.net/ososchina/blog/337295

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值