描述
最经在写项目感觉成天就写ListView,adapter了,代码冗余太重了感觉好麻烦,这两天有时间于是在网上找到了抽取程度高的适配器。
对于程序员来说做重复的工作没有多大意义, 所以还是不要敲键盘律动锻炼手指了~~~~哈哈。
文章后面我会提供demo代码里会有部分注释, 可以把包复制到你的工程里使用,可以根据自己需要修改。可以先简单看看文章顺顺思路。
这是杨鸿洋的原文,写的不错大家可以看看合适的话可以放到自己的项目中。http://blog.youkuaiyun.com/lmj623565791/article/details/38902805
杨鸿洋主要讲2个东西,抽取后的 ViewHolder ,BaseAdapter。
(1) Viewholder :
抽取后的Viewholder的作用:复用布局,通过资源id在集合里找到View ,提供多种的辅助方法设置数据。
/**
* @author 杨鸿洋适配器博客: http://blog.youkuaiyun.com/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源码下载