1.Adapter复用,项目中需要写很多的 adapter 适配器 重复代码,就想着可以进行代码复用,减少重复码代码的时间。
2.参照之前的版本进行优化。先贴上 版本1代码。

public abstract class NyBaseAdaper<T> extends BaseAdapter {

protected List<T> list = new ArrayList<>();
protected Context context;
protected LayoutInflater mInflater;

protected NyBaseAdaper(Context context, List<T> list) {
this.list = list;
this.context = context;
mInflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
if (list == null) {
return 0;
} else {
return list.size();
}
}

@Override
public Object getItem(int position) {
return list != null ? list.get(position) : 0;
}

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

继承Baseadapter 进行,使用的泛型符号,进行类型限制。将布局填充器初始化进去。让子类方便调用。这里只复写了 三个的方法。(为什么不在这里复写 getview()? )

因为 getview()需要进行处理的逻辑为了减少耦合,在另一个类中单独处理

package widget.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import java.util.List;


/**
* @author weichyang
* 2016/4/12
*/
public abstract class NyCommonAdapter<T> extends NyBaseAdaper<T> {

private LayoutInflater mInflater;

protected NyCommonAdapter(Context context, List<T> list) {
super(context, list);
mInflater = LayoutInflater.from(context);
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
Object viewHolder = null;
if (convertView == null) {
convertView = builderView(mInflater);
viewHolder = builderHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
builderData(viewHolder, position);

return convertView;
}

/**
* 填充数据
*
* @param viewHolder
* @param position
*/
protected abstract void builderData(Object viewHolder, int position);

/**
* 构造viewholder
*
* @param convertView
* @return
*/
protected abstract NyCommonAdapterTest.ViewHolder builderHolder(View convertView);

/**
* 初始化view
*
* @param inflater
* @return
*/
public abstract View builderView(LayoutInflater inflater);

/**
* 进行adapter更新
*
* @param isRefresh
* @param list
*/
public void refreshData(boolean isRefresh, List<T> list) {
if (isRefresh) {
list.addAll(list);
} else {
list.clear();
}
}


}

就是简单设置,将一些填充布局和填充数据的方法 让不同的adapter 自己实现,这里只是将处理的方法抽取出来,达到复用的目的。

Eg:唯一的缺点就是Viewholder 需要在类中 重新定义。

埋了这个伏笔。引出 version2

既然是为了方便才进行封装的。要是封装后变的复杂了。岂不是多此一举了。然后进行version 2改版。在vhTools 基础上进行扩展(参考 github 上的 commonAdapter进行优化)

**
* 通用适配ViewHolder工具类
*
* @ClassName: ViewHolderTools
* @Description: 用法参考 http://mobile.51cto.com/aprogram-475335.htm
* @author seven7fly
* @date 2015-11-30 下午2:28:42
*
*/
public class VhTools {
@SuppressWarnings("unchecked")
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}

View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
}

现在优化的点是,viewholder 需要 对viewholder之中的操作进行封装,并且具有 缓存复用的效果。

代码片段:如下

**
* @author weichyang
* 2016/4/12
*/
public class ViewHolder {
/**
* ViewHolder实现类,桥接模式适配AbsListView与RecyclerView的二维变化
*/
ViewHolderImpl mHolderImpl;


/**
* @param itemView
*/
ViewHolder(View itemView) {
mHolderImpl = new ViewHolderImpl(itemView);
}

/**
* @param viewId
* @param <T>
* @return
*/
public <T extends View> T findViewById(int viewId) {
return mHolderImpl.findViewById(viewId);
}

public Context getContext() {
return mHolderImpl.mItemView.getContext();
}

/**
* 获取GodViewHolder
*
* @param convertView
* @param parent
* @param layoutId
* @return
*/
public static ViewHolder get(View convertView, ViewGroup parent, int layoutId) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}

return viewHolder;
}

这样可以实现 缓存复用。然后让 convertView 传递给 ViewHolderImpl (为什么传给ViewHolderImpl ,无非就是为了进行代码解耦,便于扩展),注意看findviewById()
是不是和 VhTools 一样进行id 和 view 缓存。进行遍历查询。根据结果执行不同的逻辑

public class ViewHolderImpl {

/**
* 缓存子视图,key为view id, 值为View。
*/
private SparseArray<View> mCahceViews = new SparseArray<View>();
/**
* Item View
*/
View mItemView;

/**
* @param itemView
*/
ViewHolderImpl(View itemView) {
mItemView = itemView;
}

public View getItemView() {
return mItemView;
}

/**
* @param viewId
* @param <T>
* @return
*/
public <T extends View> T findViewById(int viewId) {
View target = mCahceViews.get(viewId);
if (target == null) {
target = mItemView.findViewById(viewId);
mCahceViews.put(viewId, target);
}
return (T) target;
}

用到的类:​​http://pan.baidu.com/s/1i4MMBZ3​