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 }}
阅读全文
0 0
- RecyclerView万能全套大宝剑
- 云计算如大宝剑。
- 万能RecyclerView适配器
- 万能RecyclerView 的BaseAdapter
- RecyclerView万能的Adapter
- RecyclerView万能分割线
- recyclerView 的万能适配器
- RecyclerView的万能适配器
- RecyclerView万能Adapter
- RecyclerView的万能Adapter
- RecyclerView万能分割线
- RecyclerView的万能分割线
- RecyclerView的Adapter万能适配包
- 为RecyclerView打造万能适配器
- RecyclerView的万能分割线
- 万能适配器 listview gridview RecyclerView
- RecyclerView的万能分割线
- Android RecyclerView万能分割线
- spring DelegatingFilterProxy 过滤器 的原理及运用
- 把apk提交腾讯应用市场的时候审核失败—未通过原因:拉取应用审核信息失败
- 软件测试学习笔记(1):软件测试概要
- JavaScript之Array方法不完全总结
- 1174 区间中最大的数(线段树)
- RecyclerView万能全套大宝剑
- 小知识点梳理
- 《数源思维》提问工具之“语法套”
- Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构核心技术
- CentOS 6.8 升级OpenSSH至最新版本7.5p1
- 一直处于building “XXX”gradle project info
- 网关方案总结
- CodeForces 487 C.Prefix Product Sequence(数论+构造)
- 工作总结----freemarker调用静态方法(静态属性)