ListView 万能适配器

描述

最经在写项目感觉成天就写ListView,adapter了,代码冗余太重了感觉好麻烦,这两天有时间于是在网上找到了抽取程度高的适配器。

对于程序员来说做重复的工作没有多大意义, 所以还是不要敲键盘律动锻炼手指了~~偷笑~~哈哈。


文章后面我会提供demo代码里会有部分注释, 可以把包复制到你的工程里使用,可以根据自己需要修改。可以先简单看看文章顺顺思路。

这是杨鸿洋的原文,写的不错大家可以看看合适的话可以放到自己的项目中。http://blog.csdn.net/lmj623565791/article/details/38902805 

杨鸿洋主要讲2个东西,抽取后的  ViewHolder ,BaseAdapter。

(1) Viewholder   :

      抽取后的Viewholder的作用:复用布局,通过资源id在集合里找到View ,提供多种的辅助方法设置数据。
      
/**
 * @author 杨鸿洋适配器博客: http://blog.csdn.net/lmj623565791/article/details/38902805/ 
 * @简化代码的万能Holder
 * @功能:   (1)获取ViewHolder(2)通过id找到布局 (3)一些通用的辅助的加载数据的方法; 
 * 
 * */
public class BaseViewHolder {
	private Context mContext;
	private View mConvertView ;
	private int layoutId;
	private int position;
	SparseArray<View> viewSparseArray;
	public  BaseViewHolder(Context mContext,int layoutId,ViewGroup parent,int position)
	{
		this.mContext=mContext;
		this.layoutId=layoutId;
		this.position=position;
		viewSparseArray=new SparseArray<View>();
		LayoutInflater  inflater=LayoutInflater.from(mContext);
		mConvertView=inflater.inflate(layoutId,parent,false);
		mConvertView.setTag(this);
	}

	/**
	 * 
	 * 1,创建获取viewHolder对象。
	 * 2,如果没有converView会创建,并且会setTtag复用。
	 *  
	 * */
	public static BaseViewHolder getView(Context mContext,View convertView,ViewGroup parent,int layoutId,int position)
	{
		if(convertView==null)
		{
			return  new BaseViewHolder(mContext, layoutId, parent,position);
		}
		return (BaseViewHolder) convertView.getTag();
	}

	/**
	 *通过id 找view
	 *一定会找到,没有就添加到sparseArray集合里
	 * 
	 * */
	@SuppressWarnings("unchecked")
	public <T extends View> T getViewById(int ViewId)
	{
		View view=viewSparseArray.get(ViewId);
		if(view==null)
		{
			view=mConvertView.findViewById(ViewId);
			viewSparseArray.put(ViewId, view);
		} 
		return (T) view;
	}
	/**
	 * 返回view item加载布局使用 
	 * 
	 * */
	public View getConvetView()
	{
		return mConvertView;
	}
	
	/**
	 * 设置TextView数据
	 * */
	public BaseViewHolder setTextView(int layoutId,String data)
	{
		TextView textView =getViewById(layoutId);
		if(data==null)
		{
			textView.setText("");	 
		}else
		{
		    textView.setText(data);
		}
		return  this;
	}
	 
	/**
	 * 设置ImageView本地图片
	 * */
	public BaseViewHolder setImageViewLocation(int layoutId,int src)
	{
		ImageView imagView =getViewById(layoutId);
		imagView.setImageResource(src);
		return  this;
	}
	

	/**
	 * 设置网络ImageView本地图片通过imaglaoder 加载图片
	 * */
	public BaseViewHolder setImageByImageLoder(int layoutId,String src)
	{
		ImageView imagView =getViewById(layoutId);
		//imagView.setImageResource(src);
		return  this;
	}
	
	/**
	 * 设置网络ImageView本地图片通过Glide 图片
	 * */
	public BaseViewHolder setImageByGlide(int layoutId,String src)
	{
		ImageView imagView =getViewById(layoutId);
		//imagView.setImageResource(src);
		return  this;
	}
}

      

(1) BaseAdapter:

      抽取后的BaseAdapter的作用: ,实现BaseAdapter全部方法暴露抽象方法,抽象方法提供ViewHolder,和Bean,子类具体实现。
package com.custom.baseadapter;

import java.util.List;

import com.example.baseadapter.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
/**
 * 定制适配器
 * @para <T> 泛型: 避免因为对象不同而布局相同的代码冗余
 * @param mLayoutId 布局文件。
 * @see 功能:通过抽象实现全部方法目的在于子类可以共用,减少子类的冗余。抽出来mConvetView方法,只需要提供子类具体使用控件,数据,具体的让子类实现自己使用即可。
 *  
 * 
 * */
public abstract class CustomizationBaseAdaper<T> extends BaseAdapter{
	public Context mContext;
    public List<T> mListData;
	public LayoutInflater mInflater;
	public int mLayoutId;
	public  CustomizationBaseAdaper(Context mContext,List<T> mListData,int mLayoutId)
    {
	   	this.mContext=mContext;
	   	this.mListData=mListData;
	   	this.mLayoutId=mLayoutId;
	   	this.mInflater=LayoutInflater.from(mContext);
    }
	 
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		if(mListData==null || mListData.size()==0)
		{
			return 0;
		}
		return mListData.size();
	}

	@Override
	public T getItem(int position) {
		// TODO Auto-generated method stub
		
		if(mListData==null || mListData.size()==0)
		{
			return null;
		}
		
		return mListData.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}
	
	
    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
	   // TODO Auto-generated method stub
    	
    	 BaseViewHolder viewHolder=getViewHolder(convertView,parent,position);
    	 //通过抽象的方法让子类实现  BaseViewHolder 有复用的布局对象,  getItem(position) 提供数据。
    	 mConvetView(viewHolder,getItem(position));
	     return viewHolder.getConvetView();
    }
	
    abstract  void mConvetView(BaseViewHolder ViewHolder,T itmeData);
    
    /**
     * 提供Viewholder获取对象的方法。
     * */
    public BaseViewHolder getViewHolder(View convertView,ViewGroup parent, int position)
    {
    	
    	BaseViewHolder viewHolder=BaseViewHolder.getView(mContext, convertView, parent, mLayoutId, position);
    	
    	return viewHolder;
    }
	

	 
}

提供了eclipse工程demo,一看就懂。

eclipse版本BaseAdapter源码下载

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值