封装BaseAdapter 实现类中复用

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/o279642707/article/details/51136293

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

展开阅读全文

没有更多推荐了,返回首页