一,下拉刷新數(shù)據(jù)
RecyclerView的控件的下拉刷新,官方提供了SwipeRefreshLayout類,用來實現(xiàn)下拉刷新。具體的使用方法如下:
先來看布局XML
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_recycler_view_simple"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.tbwy.recyclerview.mvp.ease.RecyclerViewSimpleActivity">
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/srl_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="@dimen/activity_horizontal_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
</android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
適配器Adapter的代碼實現(xiàn):
class RecyclerViewRefreshDataAdapter(var context: Context, var items: ArrayList<String>):RecyclerView.Adapter<RecyclerViewRefreshDataAdapter.ViewHolder>(){
companion object{
val TYPE_FOOTER = 1//添加Footer
val TYPE_HEADER = 2//添加Header
val TYPE_NORMAL = 0//兩者都沒有添加
var headerView: View? = null
var footerView: View? = null
}
var list = ArrayList<String>()
init {
list = items
}
/**
* 添加頭
*/
fun setHeaderView(hv: View){
headerView = hv
notifyItemInserted(0)
}
/**
* 添加尾
*/
fun setFooterView(fv: View){
footerView = fv
notifyItemInserted(itemCount - 1)
}
/**
* 添加到list起始位置
*/
fun insertAddAll(addList: List<String>){
list.addAll(0, addList)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
if (getItemViewType(position) == TYPE_HEADER) return
else if (getItemViewType(position) == TYPE_FOOTER) return
else{
if (holder is RecyclerViewRefreshDataAdapter.ViewHolder){
Log.e("hjd", "position->"+ position)
val positionTemp = if (headerView == null) position else position -1
if (positionTemp < items.size){
holder.tv!!.text = items[positionTemp]
holder.itemView.tag= positionTemp
}
}
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
if (headerView != null && viewType == TYPE_HEADER)
return ViewHolder(headerView!!)
if (footerView != null && viewType == TYPE_FOOTER)
return ViewHolder(footerView!!)
val view = LayoutInflater.from(context).inflate(R.layout.item_rc_4st, parent, false)
view.setOnClickListener { view -> listener?.onItemClick(view, view.tag as Int) }
return ViewHolder(view)
}
override fun getItemCount(): Int{
if (headerView != null && footerView != null)
return items.size + 2
else if(headerView == null && footerView == null)
return items.size
else
return items.size + 1
}
override fun getItemViewType(position: Int): Int {
if (headerView == null && footerView == null)
return TYPE_NORMAL
if(position == 0)
return TYPE_HEADER
if(position == itemCount-1)
return TYPE_FOOTER
return TYPE_NORMAL
}
class ViewHolder(itemTv: View):RecyclerView.ViewHolder(itemTv){
var tv: TextView? = null
init {
if (headerView != itemTv && footerView != itemTv) {
tv = itemTv.findViewById(R.id.tv) as TextView
}
}
}
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView?) {
super.onDetachedFromRecyclerView(recyclerView)
}
override fun onAttachedToRecyclerView(recyclerView: RecyclerView?) {
val manager = recyclerView!!.layoutManager
if (manager == null){
Log.e("hjd", "layoutManager == null")
}else {
if (manager is GridLayoutManager) {
val glm: GridLayoutManager = manager
glm.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
if (getItemViewType(position) == TYPE_HEADER || getItemViewType(position) == TYPE_FOOTER)
return glm.spanCount
else
return 1
}
}
}
}
}
override fun onViewAttachedToWindow(holder: ViewHolder?) {
super.onViewAttachedToWindow(holder)
val layoutParams = holder!!.itemView.layoutParams
if (layoutParams != null && layoutParams is StaggeredGridLayoutManager.LayoutParams) {
layoutParams.isFullSpan = getItemViewType(holder.layoutPosition) == TYPE_HEADER || getItemViewType(holder.layoutPosition) == TYPE_FOOTER
}
}
private var listener: OnItemClickListener?=null
fun setOnItemClickListener(l: OnItemClickListener): Unit{
this.listener = l
}
interface OnItemClickListener{
fun onItemClick(view: View, pos: Int)
}
fun addItem(pos: Int){
list.add(pos, "Add item"+ pos)
notifyItemInserted(pos)
}
fun delItem(pos: Int){
list.removeAt(pos)
notifyItemRemoved(pos)
}
}
在Activity中的代碼實現(xiàn)為:
Handler().postDelayed({
srl_refresh.overScrollMode = View.OVER_SCROLL_NEVER
srl_refresh.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark)
srl_refresh.setOnRefreshListener {
srl_refresh.isRefreshing = false
if (addList.size <= 0){
loadMoreData()
}
mAdapter!!.insertAddAll(addList)
mAdapter!!.notifyDataSetChanged()
showToast("刷新數(shù)據(jù)")
}
}, 2000)
運行程序,效果圖如下:


這樣就實現(xiàn)了RecyclerView的下拉刷新數(shù)據(jù)。
二,上拉加載數(shù)據(jù)
官方提供了下拉刷新的類,我們很容易就可實現(xiàn)下拉刷新;但是卻并沒有實現(xiàn)上拉加載的類,因此我們需要自己實現(xiàn)。
2.1,簡單實現(xiàn)
要實現(xiàn)上拉實現(xiàn),我們需要調(diào)用滑動的監(jiān)聽方法addOnScrollListener,在這里我們來進行判定滑動的狀態(tài)以加載數(shù)據(jù)
abstract class LoadRecyclerScrollListener(mgr: LinearLayoutManager) : RecyclerView.OnScrollListener(){
var currPage : Int = 0//當前頁數(shù)
var previousTotal : Int = 0//已經(jīng)加載Item數(shù)
var visibleItemCount : Int? = null//可見Item數(shù)
var totalItemCount : Int? = null//總共Item數(shù)
var fristVisibleItem : Int? = null//第一個可見Item
var loading = true//是否加載
var linearLayoutManager: LinearLayoutManager? = null
init {
linearLayoutManager = mgr
}
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
visibleItemCount = linearLayoutManager!!.childCount
totalItemCount = linearLayoutManager!!.itemCount
fristVisibleItem = linearLayoutManager!!.findFirstVisibleItemPosition()
if (loading){
if (totalItemCount!! > previousTotal){
loading = false
previousTotal = totalItemCount!!
}
}
if (!loading && (totalItemCount!! - visibleItemCount!!) <= fristVisibleItem!!){
currPage++
onLoadMore(currPage)
loading = true
}
}
abstract fun onLoadMore(page: Int)//加載數(shù)據(jù)抽象類
}
完成監(jiān)聽判定后,我們在代碼中直接調(diào)用,加載數(shù)據(jù)
rv_content.addOnScrollListener(object : EndlessRecyclerScrollListener(gridLayoutManager!!){
override fun onLoadMore(page: Int) {
Handler().postDelayed({
if (addList.size <= 0){
loadMoreData()
}
mAdapter!!.addAll(addList)
mAdapter!!.notifyDataSetChanged()
}, 2000)
}
})
在上面的適配器Adapter中增加添加數(shù)據(jù)的方法:
/**
* 添加到list末尾
*/
fun addAll(addList: List<String>){
list.addAll(addList)
}
運行程序,效果圖為:

這樣當你向上拉的時候,就能實現(xiàn)數(shù)據(jù)的加載。但是這種實現(xiàn)沒有提示,也就是沒有添加頁腳。效果不好。
2.2,添加頁腳的實現(xiàn)
我們首先來自定義一個頁腳的布局:
class LoadingFooter : RelativeLayout {
private var mState = State.Normal
private var mLoadingView: View? = null
private var mNetworkErrorView: View? = null
private var mTheEndView: View? = null
private var mLoadingProgress: ProgressBar? = null
private var mLoadingText: TextView? = null
constructor(context: Context) : super(context) {
init(context)
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
init(context)
}
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
init(context)
}
fun init(context: Context) {
View.inflate(context, R.layout.view_recycler_footer, this)
setOnClickListener(null)
setState(State.Normal, true)
}
var state: State
get() = mState
set(status) = setState(status, true)
fun setState(status: State, showView: Boolean) {
if (mState == status) {
return
}
mState = status
when (status) {
LoadingFooter.State.Normal -> {
setOnClickListener(null)
if (mLoadingView != null) {
mLoadingView!!.visibility = View.GONE
}
if (mTheEndView != null) {
mTheEndView!!.visibility = View.GONE
}
if (mNetworkErrorView != null) {
mNetworkErrorView!!.visibility = View.GONE
}
}
LoadingFooter.State.Loading -> {
setOnClickListener(null)
if (mTheEndView != null) {
mTheEndView!!.visibility = View.GONE
}
if (mNetworkErrorView != null) {
mNetworkErrorView!!.visibility = View.GONE
}
if (mLoadingView == null) {
val viewStub = findViewById(R.id.loading_viewstub) as ViewStub
mLoadingView = viewStub.inflate()
mLoadingProgress = mLoadingView!!.findViewById(R.id.pg_loading) as ProgressBar
mLoadingText = mLoadingView!!.findViewById(R.id.tv_loaddata) as TextView
} else {
mLoadingView!!.visibility = View.VISIBLE
}
mLoadingView!!.visibility = if (showView) View.VISIBLE else View.GONE
mLoadingProgress!!.visibility = View.VISIBLE
}
LoadingFooter.State.TheEnd -> {
setOnClickListener(null)
if (mLoadingView != null) {
mLoadingView!!.visibility = View.GONE
}
if (mNetworkErrorView != null) {
mNetworkErrorView!!.visibility = View.GONE
}
if (mTheEndView == null) {
val viewStub = findViewById(R.id.end_viewstub) as ViewStub
mTheEndView = viewStub.inflate()
} else {
mTheEndView!!.visibility = View.VISIBLE
}
mTheEndView!!.visibility = if (showView) View.VISIBLE else View.GONE
}
LoadingFooter.State.NetWorkError -> {
if (mLoadingView != null) {
mLoadingView!!.visibility = View.GONE
}
if (mTheEndView != null) {
mTheEndView!!.visibility = View.GONE
}
if (mNetworkErrorView == null) {
val viewStub = findViewById(R.id.network_error_viewstub) as ViewStub
mNetworkErrorView = viewStub.inflate()
} else {
mNetworkErrorView!!.visibility = View.VISIBLE
}
mNetworkErrorView!!.visibility = if (showView) View.VISIBLE else View.GONE
}
else -> {
}
}
}
enum class State {
Normal, TheEnd, Loading, NetWorkError
}
}
進行Adapter的實現(xiàn),此Adapter完成了頁腳的數(shù)據(jù)適配:
abstract class BaseLoadMoreAdapter<T>(context: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private var mFooterViewParent: FrameLayout? = null//腳布局容器
private var mFooterView: View? = null//腳布局
private var isShowFooter = false//是否顯示腳布局
private var itemsList = ArrayList<T>()//腳布局
private var mContext: Context? = null
companion object{
val TYPE_LOAD_MORE = Int.MIN_VALUE + 1//腳布局類型
}
init {
mContext = context
}
/**
* 添加數(shù)據(jù)
*/
fun addAll(items: ArrayList<T>){
itemsList.addAll(items)
this.notifyDataSetChanged()
}
/**
* 添加數(shù)據(jù)
*/
fun addAllInsert(items: ArrayList<T>){
itemsList.addAll(0, items)
this.notifyDataSetChanged()
}
/**
* 清除數(shù)據(jù)
*/
fun clear(){
itemsList.clear()
}
fun getAllData(): ArrayList<T>{
return itemsList
}
override fun getItemViewType(position: Int): Int {
if (isShowFooter && position == itemCount - getFooterCount())
return TYPE_LOAD_MORE
return mySelfItemViewType(position)
}
/**
* 返回正常類型的布局標記
*/
private fun mySelfItemViewType(position: Int): Int{
return super.getItemViewType(position)//父類默認返回的就是0
}
private fun getFooterCount(): Int {
if (isShowFooter)
return 1
else
return 0
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
if (position != itemCount - getFooterCount()){
mySelfOnBindViewHolder(holder, position)
}
}
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
if (viewType == TYPE_LOAD_MORE){
if (mFooterViewParent == null){
mFooterViewParent = FrameLayout(mContext)
parent!!.addView(mFooterViewParent)
if (mFooterView != null){
mFooterViewParent!!.addView(mFooterView)
}
}
return ViewHodlerLoadMore(mFooterViewParent)
}
return mySelfViewHolder(parent, viewType)
}
override fun getItemCount(): Int {
val count = if (itemsList.size == 0) 0 else itemsList.size
return count + getFooterCount()
}
/**
* 設置腳布局
*/
fun setFooterView(footerView: View){
mFooterView = footerView
isShowFooter = true
if (mFooterViewParent != null && mFooterViewParent!!.childCount == 0){
mFooterViewParent!!.addView(mFooterView)
}
}
/**
* 移除腳布局
*/
fun removeFooterView(){
isShowFooter = false
notifyDataSetChanged()
// mFooterViewParent.removeView(footerView)
}
/**
* 實現(xiàn)加載空間的VIewHolder
*/
class ViewHodlerLoadMore(itemView: View?) : RecyclerView.ViewHolder(itemView)
/**
* 實現(xiàn)自己的VIewHolder
*/
abstract fun mySelfViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder
/**
* 為控件賦值
*/
abstract fun mySelfOnBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int)
}
在來實現(xiàn)完成了Item適配的Adapter:
open class LoadMoreAdapter(context: Context) : BaseLoadMoreAdapter<String>(context){
private var mContext: Context? = null
private var mItems= ArrayList<String>()
init {
mContext = context
refreshData()
}
override fun mySelfViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
val view = LayoutInflater.from(mContext).inflate(R.layout.item_rc_4st, parent, false)
return ViewHolderMore(view)
}
override fun mySelfOnBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
(holder!! as ViewHolderMore).tv.text = mItems[position]
}
class ViewHolderMore(itemView: View?): RecyclerView.ViewHolder(itemView){
var tv = itemView!!.findViewById(R.id.tv) as TextView
}
fun refreshData(){//刷新數(shù)據(jù)
mItems = getAllData()
notifyDataSetChanged()
}
}
創(chuàng)建一個進行加載數(shù)據(jù)的接口:
interface OnLoadMore {
fun onLoadMore(view: View)
}
重寫滑動監(jiān)聽方法:
open class LoadMoreOnScrollViewListener(min: Int) : RecyclerView.OnScrollListener(), OnLoadMore{
enum class LayoutManagerType{
LinearLayoutManager,
GridLayoutManager,
StaggeredGridLayoutManager
}
private var lastPositions: IntArray? = null
private var lastVisibleItemPosition: Int? = 0
private var currScrollStatus = 0
private var minPositionToEndless = 1
private var layoutManagerType: LayoutManagerType? = null
init {
minPositionToEndless = min
}
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
currScrollStatus = newState
val layoutManager = recyclerView!!.layoutManager
val visibleItemCount = layoutManager.childCount
val totalItemCount = layoutManager.itemCount
if (visibleItemCount > 0 && currScrollStatus == RecyclerView.SCROLL_STATE_IDLE
&& lastVisibleItemPosition!! >= totalItemCount - minPositionToEndless){
onLoadMore(recyclerView)
}
}
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val layoutManager = recyclerView!!.layoutManager
if (layoutManagerType == null){
if (layoutManager is LinearLayoutManager)
layoutManagerType = LayoutManagerType.LinearLayoutManager
else if(layoutManager is GridLayoutManager)
layoutManagerType = LayoutManagerType.GridLayoutManager
else if (layoutManager is StaggeredGridLayoutManager)
layoutManagerType = LayoutManagerType.StaggeredGridLayoutManager
else
throw RuntimeException("unsupported LayoutManager used, Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager")
}
when(layoutManagerType){
LayoutManagerType.LinearLayoutManager ->{lastVisibleItemPosition = (layoutManager as LinearLayoutManager).findLastVisibleItemPosition()}
LayoutManagerType.GridLayoutManager ->{lastVisibleItemPosition = (layoutManager as GridLayoutManager).findLastVisibleItemPosition()}
LayoutManagerType.StaggeredGridLayoutManager ->{
val staggeredGridLayoutManager = layoutManager as StaggeredGridLayoutManager
if (lastPositions == null){
lastPositions = kotlin.IntArray(staggeredGridLayoutManager.spanCount)
}
staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions)
lastVisibleItemPosition = findMax(lastPositions!!)
}
}
}
fun findMax(posArr: IntArray): Int{
return posArr.indices.max()?: posArr[0]
}
override fun onLoadMore(view: View) {
}
}
接下來就是在代碼中進行使用了:
class LoadMoreDefineActivityActivity : AppCompatActivity() {
private var rcAdapter: LoadMoreAdapter? = null
private var itemList = ArrayList<String>()
private var addList = ArrayList<String>()
private var loadingFooter: LoadingFooter? = null
private val pageCount = 10
private var lastPosition = 0//上一次的加載數(shù)量
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recycler_view_simple_refresh_data)
initData()
}
fun initData(){
loadMoreData(20, itemList, "數(shù)據(jù)")
rcAdapter = LoadMoreAdapter(this)
rv_content.layoutManager=LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
rv_content.adapter = rcAdapter
rv_content.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
srl_refresh.overScrollMode = View.OVER_SCROLL_NEVER
srl_refresh.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark)
srl_refresh.setOnRefreshListener {//下拉刷新
srl_refresh.isRefreshing = false
val insertData = ArrayList<String>()
loadMoreData(5, insertData, "下拉刷新數(shù)據(jù)")
rcAdapter!!.addAllInsert(insertData)
}
rv_content.addOnScrollListener(object : LoadMoreOnScrollViewListener(1){
override fun onLoadMore(view: View) {
super.onLoadMore(view)
getData(false)
}
})
if (loadingFooter == null && itemList.isNotEmpty() ){
loadingFooter = LoadingFooter(this)
rcAdapter!!.setFooterView(loadingFooter!!)
}
getData(true)
}
private fun getData(isFirst: Boolean) {
if (itemList.isEmpty())
return
if (loadingFooter!!.state == LoadingFooter.State.Loading || (!isFirst && loadingFooter!!.state == LoadingFooter.State.TheEnd))
return
if (!isFirst) {
loadingFooter!!.state = LoadingFooter.State.Loading
}else{
rcAdapter!!.addAll(itemList)
}
Handler().postDelayed({
if (isFirst)
rcAdapter!!.clear()
addList = getServerData()
if (addList.size < pageCount){
loadingFooter!!.setState(LoadingFooter.State.TheEnd, true)
}else{
loadingFooter!!.state = LoadingFooter.State.Normal
}
if (addList.isNotEmpty()){
rcAdapter!!.addAll(addList)
lastPosition += addList.size
}
}, 1000)
}
private fun loadMoreData(number: Int, list: ArrayList<String>, string: String) {
(0..number-1).mapTo(list) {string+ "Item " + it}
}
private fun getServerData(): ArrayList<String>{
val end = if (lastPosition + pageCount > itemList.size) itemList.size else lastPosition + pageCount
val tempArr = ArrayList<String>()
(lastPosition..end-1).mapTo(tempArr) { itemList[it] }
return tempArr
}
}
運行程序,效果圖如下:


三,引用第三方框架
從上面來看自己寫的話,太浪費時間了,如果是自己進行學習的話,那就另說了。下面給推薦一個框架BRVAH,里面集成了分割線,Item動畫,數(shù)據(jù)刷新,Adapter...;在此網(wǎng)站中下載Demo,將里面的library引入自己的項目中
我們用此框架來實現(xiàn)數(shù)據(jù)刷新,看Adapter代碼:
class RecyclerViewRefreshDataOthersAdapter(layoutResId: Int, items: ArrayList<String>) : BaseQuickAdapter<String, BaseViewHolder>(layoutResId, items){
override fun convert(helper: BaseViewHolder?, item: String?) {
helper!!.addOnClickListener(R.id.tv)
helper.setText(R.id.tv, item)
}
}
在來看Activity中的使用:
class RecyclerViewRefreshDataOthersActivity : BaseKotlinActivity() {
private var itemList= ArrayList<String>()
private var rcAdapter: RecyclerViewRefreshDataOthersAdapter? = null
private val pageSize = 10//頁數(shù)據(jù)量
private var currCount = 0//當前數(shù)據(jù)量
private val totalCount = 30//全部數(shù)據(jù)量
private var isError = true//加載數(shù)據(jù)是否出錯
override fun getLayoutResoucesId(): Int {
return R.layout.activity_recycler_view_simple_refresh_data
}
override fun init() {
super.init()
initData()
}
fun initData(){
loadMoreData(10, itemList, "數(shù)據(jù)")
rcAdapter = RecyclerViewRefreshDataOthersAdapter(R.layout.item_rc_4st, itemList)
rcAdapter!!.openLoadAnimation(BaseQuickAdapter.SLIDEIN_RIGHT)//進入動畫
rv_content.layoutManager=LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
rv_content.adapter = rcAdapter
srl_refresh.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark)
Handler().postDelayed({
srl_refresh.setOnRefreshListener {//下拉刷新
val insertData = ArrayList<String>()
loadMoreData(10, insertData, "下拉刷新數(shù)據(jù)")
rcAdapter!!.setNewData(insertData)
rcAdapter!!.setEnableLoadMore(true)
srl_refresh.isRefreshing = false
}
}, 1000)
rcAdapter!!.setOnLoadMoreListener({
srl_refresh.isEnabled = false
rv_content.postDelayed({
if(rcAdapter!!.data.size < pageSize){
rcAdapter!!.loadMoreEnd(true)//true is gone,false is visible
}else{
if (currCount >= totalCount){
rcAdapter!!.loadMoreEnd(true)
}else{
if (!isError){
val loadData = ArrayList<String>()
loadMoreData(5, loadData, "上拉加載數(shù)據(jù)")
rcAdapter!!.addData(loadData)
currCount = rcAdapter!!.data.size
rcAdapter!!.loadMoreComplete()
}else{
isError = false
rcAdapter!!.loadMoreFail()
}
}
}
srl_refresh.isEnabled = true
}, 1000)
})
}
private fun loadMoreData(number: Int, list: ArrayList<String>, string: String) {
(0..number-1).mapTo(list) {string+ "Item " + it}
}
}
運行程序,效果實現(xiàn)。
補充
第三方中點擊事件的使用,看代碼:
class RecyclerViewRefreshDataOthersAdapter(layoutResId: Int, items: ArrayList<String>) : BaseQuickAdapter<String, BaseViewHolder>(layoutResId, items){
override fun convert(helper: BaseViewHolder?, item: String?) {
helper!!.addOnClickListener(R.id.tv)
.addOnClickListener(R.id.btn)
helper.setText(R.id.tv, item)
helper.setText(R.id.btn, item)
}
}
上面的代碼給TextView和Button添加了點擊事件,這兩個屬于子條目中的子控件。來看一下點擊事件的實現(xiàn):
rv_content.addOnItemTouchListener(object : OnItemClickListener(){
//這個屬于item的點擊事件
override fun onSimpleItemClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) {
showToast("pos->"+ position)
Log.e("hjd", "pos->"+ position)
}
// 這個是子Item中子控件的點擊事件
override fun onItemChildClick(adapter: BaseQuickAdapter<*, *>?, view: View?, position: Int) {
when(view?.id){
R.id.tv -> {
showToast("tv->"+ position)
Log.e("hjd", "tv->"+ position)
}
R.id.btn -> {
showToast("btn->"+ position)
Log.e("hjd", "btn->"+ position)
}
}
}
})
四,參考文章
1,第三方框架BRVAH
2,RecyclerView上拉加載更多菜鳥自用,大神繞道