Android 通用Adapter封装

从开始学习封装,就是仿照慕课网某视频学习的。这才过去半年,自己也有思路了,现在把我的封装代码贴出来,给初学者一点帮助吧。有任何问题,请联系我。

/**
 * 描述:单布局适配器基类
 * author SunXiaoGang
 * E-mail sunxiaogang0214@163.com
 * Created by SunXiaoGang on 16/9/23.
 */
public abstract class BasicAdapter<T,V> extends BaseAdapter {

    protected List<T> list;
    protected Context context;

    // TODO: 16/9/23 正式环境 换0
    @Override
    public int getCount() {
        return list == null ? 0 : list.size();
    }

    @Override
    public T getItem(int position) {
        T t = null;
        if (list != null) {
            t = list.get(position);
        }
        return t;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        V baseHolder;
        if (context == null) {
            context=parent.getContext();
        }

        if (convertView == null) {
            baseHolder = getBaseHolder();
            convertView = LayoutInflater.from(context).inflate(getLayoutId(), null);
            convertView.setTag(baseHolder);
            x.view().inject(baseHolder,convertView);
            //其他处理
            otherHandle(baseHolder);
        } else {
            baseHolder= (V) convertView.getTag();
        }

        T bean=null;
        if (list != null) {
            bean=list.get(position);
        }

        bindView(position,convertView,parent,baseHolder,bean);
        return convertView;
    }


    /**
     *
     * @return BaseHolder
     */
    protected abstract V getBaseHolder();
    /**
     * 绑定控件
     * @param position position
     * @param convertView convertView
     * @param parent parent
     * @param mHolder holder
     */
    protected abstract void bindView(int position, View convertView, ViewGroup parent,V mHolder,T bean);

    /**
     * 其他处理
     */
    protected void otherHandle(V holder) {

    }
    /**
     *
     * @return Layout Id
     */
    protected abstract int getLayoutId();
    //其他共有方法
    public void addList(List<T> var) {
        if (isListEmpty(var)) {
            return;
        }
        if (isListEmpty(list)) {
            this.list = var;
        } else {
            this.list.addAll(var);
        }
        notifyDataSetChanged();
    }

    /**
     * 页面跳转
     * @param intent
     */
    protected void startActivity(Intent intent) {
        context.startActivity(intent);
    }
    /**
     * 判断List是否为空
     * @param var list对象
     * @return true or false
     */
    private boolean isListEmpty(List var) {
        if (var == null || var.size() == 0) {
            return true;
        }
        return false;
    }
    //各种set和get方法
    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
        notifyDataSetChanged();
    }

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    /**
     * View点击事件,做页面跳转 包括item点击事件
     */
    public void viewOnClickIntent(View view, final Intent intent) {
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(intent);
            }
        });
    }

}```

先简单说下吧。这两个泛型:T 数据源泛型(传实体的) V:ViewHolder泛型(本项目使用注解,如果不使用注解,ViewHolder的构造应该传入convertView,同样的`/**
     * 其他处理
     */
    protected void otherHandle(V holder) {

    }`这个代码应该改为`/**
     * 其他处理
     */
    protected void otherHandle(View convertView,V holder) {

    }`这样,在这个方法里各种findViewById),至于这些代码` /**
     * 页面跳转
     * @param intent
     */
    protected void startActivity(Intent intent) {
        context.startActivity(intent);
    }
    /**
     * 判断List是否为空
     * @param var list对象
     * @return true or false
     */
    private boolean isListEmpty(List var) {
        if (var == null || var.size() == 0) {
            return true;
        }
        return false;
    }
    /**
     * View点击事件,做页面跳转 包括item点击事件
     */
    public void viewOnClickIntent(View view, final Intent intent) {
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(intent);
            }
        });
    }`是项目能使用到的一些小的工具,能用用,不能用就删

具体使用
创建一个数据实体

/**
* 描述:测试实体
* author SunXiaoGang
* E-mail sunxiaogang0214@163.com
* Created by SunXiaoGang on 16/10/12.
*/
public class TextBean {
}

和一个Adapter的内部类

public class TextHolder {
}

<P>为什么要使用内部类? 方便。</p>
传入Adapter的泛型,如下:

/**
* 描述:
* author SunXiaoGang
* E-mail sunxiaogang0214@163.com
* Created by SunXiaoGang on 16/10/12.
*/
public class TextAdapter extends BasicAdapter

然后添加需要重写的抽象方法结果如下:

/**
* 描述:
* author SunXiaoGang
* E-mail sunxiaogang0214@163.com
* Created by SunXiaoGang on 16/10/12.
*/
public class TextAdapter extends BasicAdapter

最后完善,设置布局id和new新的Holder,最终代码如下:

/**
* 描述:
* author SunXiaoGang
* E-mail sunxiaogang0214@163.com
* Created by SunXiaoGang on 16/10/12.
*/
public class TextAdapter extends BasicAdapter


最后在

@Override
protected void bindView(int position, View convertView, ViewGroup parent, TextHolder mHolder, TextBean bean) {

}
做各种绑定事件,好了,完结了。以上代码复制就能用,如果不使用注解模块,在BasicAdapter的getView()方法里去掉这一句代码

x.view().inject(baseHolder,convertView);

然后重写

/**
* 其他处理
*/
protected void otherHandle(V holder) {

}
在这里findViewById,把上面那个方法替换成下面的方法

/**
* 其他处理
*/
protected void otherHandle(View convertView,V holder) {

}
并且修改getVIew()里面的

//其他处理
otherHandle(baseHolder);

//其他处理
otherHandle(convertView,baseHolder);
“`
完结,有问题请回复。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值