RecyclerView万能全套大宝剑

1.万能Adapter:


package xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxx

import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import 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.xxx

import android.content.Context
import android.support.v7.widget.RecyclerView
import android.view.View
import 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.xxxxxxxxxxx

import android.Manifest
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.PhoneUtils
import com.lzy.okgo.OkGo
import com.mylhyl.acp.Acp
import com.mylhyl.acp.AcpListener
import 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.Context
import android.support.v7.widget.*
import com.maoshi.supergodparks.app.home.adapter.OneRvTypeHodlerAdapter
import 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
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值