RecyclerView万能全套大宝剑

来源:互联网 发布:unity3d导出apk 编辑:程序博客网 时间:2024/04/27 06:33

1.万能Adapter:


package xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxximport android.content.Contextimport android.support.v7.widget.RecyclerViewimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport com.blankj.utilcode.util.LogUtils/** * ================================================ * 项目名称:xxxxxxxxxxx * 类 描 述:RecyclerView万能适配器【继承基类】,T为封装的数据类型,根据传入的参数决定具体类型。 * 创 建 人:IMissYou * 创建时间:2017/5/31 17:42 * 修 改 人:IMissYou * 修改时间:2017/5/31 17:42 * 修改备注: * 版    本:Vs.1.0.0 * 修订版本:Vs.1.0.2 * ================================================ */abstract class BaseRecyclerAdapter<T,VH: BaseAbstartViewHolder<T>>(that: Context, datas: MutableList<T>?) : RecyclerView.Adapter<VH>() {    val VIEW_HEADER = 0;  //说明是带有Header的    val VIEW_FOOTER = 1;  //说明是带有Footer的    val VIEW_NORMAL = 2;  //说明是不带有header和footer的    protected var mContext: Context    protected var mDatas: MutableList<T>    protected var mInflater: LayoutInflater    //HeaderView, FooterView 一般用于广告    private var mHeaderView: View? = null    private var mFooterView: View? = null    init {        this.mContext = that        mInflater = mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater        if (datas == null) {            this.mDatas = mutableListOf<T>()        }else{            this.mDatas = datas        }    }    /**     * item条目总数,根据头尾部变化。     */    override fun getItemCount(): Int {        if (mHeaderView == null && mFooterView == null) {            return mDatas.size;        } else if (mHeaderView == null && mFooterView != null) {            return mDatas.size + 1;        } else if (mHeaderView != null && mFooterView == null) {            return mDatas.size + 1;        } else {            return mDatas.size + 2;        }    }    /**设置头部,如果取消也可以使用此接口*/    fun setHeaderView(headerView: View? ) {        if (headerView == null){            LogUtils.e(" headerView is null")        }        mHeaderView = headerView;        notifyItemInserted(0);    }    /**获取头部视图对象*/    fun getHeaderView(): View? {        return mHeaderView;    }    /**设置尾部*/    fun setFooterView(footerView: View? ) {        if (footerView == null){            LogUtils.e(" footerView is null")        }        mFooterView = footerView;        notifyItemInserted(getItemCount() - 1);    }    /**获取尾部视图对象*/    fun getFooterView(): View? {        return mFooterView;    }    /** 更新数据,替换原有数据  */    fun updateItems(items: MutableList<T>) {        mDatas = items        notifyDataSetChanged()    }    /** 插入一条数据  */    fun addItem(item: T) {        mDatas.add(0, item)        notifyItemInserted(0)    }    /** 插入一条数据  */    fun addItem(item: T, positions: Int) {        var position = positions        position = Math.min(position, mDatas.size)        mDatas.add(position, item)        notifyItemInserted(position)    }    /** 在列表尾添加一串数据  */    fun addItems(items: List<T>) {        val start = mDatas.size        mDatas.addAll(items)        notifyItemRangeChanged(start, items.size)    }    /** 移除一条数据  */    fun removeItem(position: Int) {        if (position > mDatas.size - 1) {            return        }        mDatas.removeAt(position)        notifyItemRemoved(position)    }    /** 移除一条数据  */    fun removeItem(item: T) {        var position = 0        val iterator = mDatas.listIterator()        while (iterator.hasNext()) {            val next = iterator.next()            if (next === item) {                iterator.remove()                notifyItemRemoved(position)            }            position++        }    }    /** 清除所有数据  */    fun removeAllItems() {        mDatas.clear()        notifyDataSetChanged()    }    /**     * 重写getItemViewType()方法,过滤条目的返回类型     */    override fun getItemViewType(position: Int): Int {        // mHeaderView和mFooterView都不加载        if (mHeaderView == null && mFooterView == null){            return VIEW_NORMAL;        }        // 第一个加载mHeaderView        if(position == 0){            return VIEW_HEADER        }        // 倒数第一个加载mFooterView        if(position == itemCount - 1){            return VIEW_FOOTER        }        return VIEW_NORMAL    }    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): VH? {        when(viewType){            VIEW_HEADER -> return mHeaderView?.let { onCreateHeaderViewHolder(it) }            VIEW_FOOTER -> return mFooterView?.let { onCreateFooterViewHolder(it) }            VIEW_NORMAL -> return onCreateHolder(parent,viewType)            else -> LogUtils.e("viewType = ${viewType} ,类型值不在 VIEW_HEADER=${VIEW_HEADER},VIEW_FOOTER=${VIEW_FOOTER},VIEW_NORMAL=${VIEW_NORMAL} 区间内?")        }        return null    }    /**     * 考虑到不是每个Rv都会有头部,所以设计为可重写方法,有头部显示时调用此方法,子类重写即可。     */    open fun onCreateHeaderViewHolder(it: View): VH?{        return null    }    /**     * 考虑到不是每个Rv都会有尾部,所以设计为可重写方法,有尾部显示时调用此方法,子类重写即可。     */    open fun onCreateFooterViewHolder(it: View): VH?{        return null    }    /**     * 这个显示的item比较多,所以设计成抽象方法。     */    abstract fun onCreateHolder(parent: ViewGroup?, viewType: Int): VH?    /**     * 绑定数据     */    override fun onBindViewHolder(holder: VH?, position: Int) {        if (holder != null){            if (getItemViewType(position) == VIEW_HEADER){                holder.bindHeader(mDatas.get(position))            }else if(getItemViewType(position) == VIEW_FOOTER){                holder.bindFooter(mDatas.get(position))            }else{                holder.bindHolder(mDatas.get(position))            }        }    }}

2.万能Hodler:

package xxxxxxxxxxxxxxxxxxx.xxximport android.content.Contextimport android.support.v7.widget.RecyclerViewimport android.view.Viewimport com.blankj.utilcode.util.LogUtils/** * ================================================ * 项目名称:xxxxxxxxxxx * 类 描 述:RecyclerView万能数据装配器【继承基类】,T为封装的数据类型,根据传入的数据类型决定。 * 创 建 人:IMissYou * 创建时间:2017/5/27 16:01 * 修 改 人:IMissYou * 修改时间:2017/5/27 16:01 * 修改备注: * 版    本:Vs.1.0.0 * 修订版本:Vs.1.0.2 * ================================================ */abstract class BaseAbstartViewHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) {    protected var mContext: Context? = null    /**     * 绑定头部数据,有需要时子类可以重写。     */    open fun bindHeader(person: T){        LogUtils.d(" bindHeader 被调用了。")    }    /**     * 绑定尾部数据,有需要时子类可以重写。     */    open fun bindFooter(person: T){        LogUtils.d(" bindFooter 被调用了。")    }    /**     * 绑定其他数据,这个使用的比较多,所以抽象。     */    abstract fun bindHolder(person: T)}

3.配套Fragment:

package xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxximport android.Manifestimport android.content.Intentimport android.os.Bundleimport android.support.v4.app.Fragmentimport android.view.LayoutInflaterimport android.view.Viewimport android.view.ViewGroupimport android.widget.Toastimport com.blankj.utilcode.util.LogUtilsimport com.blankj.utilcode.util.PhoneUtilsimport com.lzy.okgo.OkGoimport com.mylhyl.acp.Acpimport com.mylhyl.acp.AcpListenerimport com.mylhyl.acp.AcpOptions/** * ================================================ * 项目名称:xxxxxxxxxxxxxxxx * 类 描 述:碎片基类,子类不建议使用构造函数传值,有bug * 创 建 人:IMissYou * 创建时间:2017/5/26 14:32 * 修 改 人:IMissYou * 修改时间:2017/5/26 14:32 * 修改备注: * 版    本:Vs.1.0.0 * 修订版本:Vs.1.0.2 * ================================================ */abstract class BaseFragment: Fragment(),View.OnClickListener {    protected val TGA = javaClass.name    private var isVisbles = false //界面是否可见    private var isPrepared = false  //确保 showData()方法不会报空指针异常    private var isFirst = true //isFirst确保ViewPager来回切换时BaseFragment的showData方法不会被重复调用    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {        var view = inflater.inflate(setLayout(),container,false)        return view    }    override fun onActivityCreated(savedInstanceState: Bundle?) {        super.onActivityCreated(savedInstanceState)        if (arguments!=null){            getSetArgs(arguments)        }        setEvent()        setData()    }    open fun getSetArgs(arguments: Bundle?) {    }    override fun setUserVisibleHint(isVisibleToUser: Boolean) {        super.setUserVisibleHint(isVisibleToUser)        if(userVisibleHint){            lazyLoad()            isVisbles = true        }else{            missData()            isVisbles = false        }    }    /**     * 加载xml布局     */    protected abstract fun setLayout(): Int    /**     * 添加事件监听     */    protected abstract fun setEvent()    /**     * 初始化数据     */    protected abstract fun setData()    /**     * 控件点击事件     */    protected abstract fun processClick(v: View)    override fun onClick(v: View?) {        processClick(v!!)    }    private fun lazyLoad() {        if (!isPrepared || !isVisbles || !isFirst){            return        }        showData();        isFirst = false;    }    /**     * 界面可见是加载,需要懒加载是子类重写即。     */    open fun showData() {    }    /**     * 界面不可见处理     */    open fun missData() {    }    override fun onDestroy() {        super.onDestroy()        //Activity销毁时,取消网络请求        OkGo.getInstance().cancelTag(this)    }}

4.RecylerView辅助类:

package ************************************.***import android.content.Contextimport android.support.v7.widget.*import com.maoshi.supergodparks.app.home.adapter.OneRvTypeHodlerAdapterimport com.maoshi.supergodparks.app.home.data.TypeOneBean/** * ================================================ * 项目名称:*********** * 类 描 述: * 创 建 人:IMissYou * 创建时间:2017/6/30 9:23 * 修 改 人:IMissYou * 修改时间:2017/6/30 9:23 * 修改备注: * 版    本:Vs.1.0.0 * 修订版本:Vs.1.0.2 * ================================================ */class BaseRecyclerViewTools {    /**     * 横向滑动     */    fun<T> addHORIZONTAL(content: Context, rv: RecyclerView, at: BaseRecyclerAdapter<T,BaseAbstartViewHolder<T>>,cout:Int){        rv.layoutManager= GridLayoutManager(content,cout)        rv.itemAnimator = DefaultItemAnimator()        rv.addItemDecoration(DividerItemDecoration(content, DividerItemDecoration.HORIZONTAL))        rv.adapter = at    }    /**     * 纵向滑动     */    fun<T> setVERTICAL(content: Context, rv: RecyclerView, at: BaseRecyclerAdapter<T,BaseAbstartViewHolder<T>>){        val linearLayoutManager = LinearLayoutManager(content);        linearLayoutManager.orientation = LinearLayoutManager.VERTICAL        rv.layoutManager = linearLayoutManager        rv.adapter = at    }    /**     * 横向滑动     */    fun<T> setHORIZONTAL(content: Context, rv: RecyclerView, at: BaseRecyclerAdapter<T,BaseAbstartViewHolder<T>>){        val linearLayoutManager = LinearLayoutManager(content);        linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL        rv.layoutManager = linearLayoutManager        rv.adapter = at    }    /**     * 纵向滑动     */    fun<T> addVERTICAL(content: Context, rv: RecyclerView, at: BaseRecyclerAdapter<T,BaseAbstartViewHolder<T>>,cout:Int){        rv.layoutManager= GridLayoutManager(content,cout)        rv.itemAnimator = DefaultItemAnimator()        rv.addItemDecoration(DividerItemDecoration(content, DividerItemDecoration.VERTICAL))        rv.adapter = at    }}



原创粉丝点击