必须重写的方法
- 获取layoutId--->
getLayoutId(viewType: Int): Int
- 新的绑定view方法--->
bindHolder(holder: BaseViewHolder, data: DATA, position: Int)
非必需方法
- item点击事件--->
setOnClickListener(onClickListener: OnClickListener<DATA>)方法
- item长按事件--->
setOnLongClickListener(onLongClickListener: OnLongClickListener<DATA>)方法
- 获取View--->
fun <T : View> getView(viewId: Int): T
- 设置TextView.text--->
fun setText(viewId: Int, str: String)
- 设置imageView.setImageResource--->
setImageResource(viewId: Int, resourceId: Int)
- 设置setPathImage--->
fun setPathImage(viewId: Int, imageLoader: BaseImageLoader)
仿照ListView主要逻辑
- 改变
GridLayoutManager
一行显示几个方法--->重写changeSpanSize(position: Int): Int
- 添加头部方法--->
fun addHeaderView(view: View)
- 移除头部方法--->
fun removeHeaderView(view: View)
- 添加底部方法--->
fun addFooterView(view: View)
- 移除底部方法--->
fun removeFooterView(view: View)
- 添加空布局方法--->
fun addEmptyView(view: View)
/**
* 刷新默认状态
*/
const val REFRESH_DEFAULT = -1
/**
* 刚开始下拉
*/
const val DROP_DOWN_REFRESH_START = 0
/**
* 下拉正在刷新
*/
const val DROP_DOWN_REFRESH_ING = 1
/**
* 下拉刷新成功
*/
const val DROP_DOWN_REFRESH_SUCCESS = 2
/**
* 下拉刷新失败
*/
const val DROP_DOWN_REFRESH_FAILURE = 3
/**
* 刚开始上拉
*/
const val PULL_UP_REFRESH_START = 4
/**
* 上拉正在刷新
*/
const val PULL_UP_REFRESH_ING = 5
/**
* 上拉刷新成功
*/
const val PULL_UP_REFRESH_SUCCESS = 6
/**
* 上拉刷新失败
*/
const val PULL_UP_REFRESH_FAILURE = 7
/**
* 上拉刷新没有更多数据
*/
const val PULL_UP_REFRESH_END = 8
fun addRefreshListener(refreshListener: RefreshListener, isHashRefresh: Boolean = true, isHashLoad: Boolean = true)
可重写的监听内部方法,来改变刷新时view的显示样式
-
下拉刷新样式更改及网络请求位置
/** * 获取下拉加载更多的开始View */ fun getRefreshViewStart(context: Context): View? { return 开始View } /** * 获取下拉加载更多的正在加载View */ fun getRefreshViewing(context: Context): View? { return 正在加载View } /** * 获取下拉加载更多的加载成功View */ fun getRefreshViewSuccess(context: Context): View? { return 成功View } /** * 获取下拉加载更多的加载失败View */ fun getRefreshViewFailure(context: Context): View? { return 失败View } /** * 正在刷新 */ fun onRefreshing() { //网络加载刷新数据 }
-
上拉刷新样式更改及网络请求位置
/** * 获取上拉加载更多的开始View */ fun getLoadViewStart(context: Context): View? { return 开始View } /** * 获取上拉加载更多的正在加载View */ fun getLoadViewing(context: Context): View? { return 正在加载View } /** * 获取上拉加载更多的加载成功View */ fun getLoadViewSuccess(context: Context): View? { return 加载成功View } /** * 获取上拉加载更多的加载失败View */ fun getLoadViewFailure(context: Context): View? { return 加载失败View } /** * 获取上拉加载更多的没有更多数据的View */ fun getLoadViewEnd(context: Context): View? { return 没有更多数据的View } /** * 正在加载中 */ fun onLoading() { //网络数据请求 }
-
共有方法手指拖拽距离,用来改变view样式(对需要根据拖拽距离改变样式的view需要)
/** * 拖拽距离 * * @param dragHeight 拖拽距离 * @param currentStatus 当前状态[-1,8] */ fun onDragDistance(dragHeight: Int, @RefreshConst currentStatus: Int) {}
- 下拉刷新成功--->
fun refreshHeaderSuccess()
- 下拉刷新失败--->
fun refreshHeaderFailure()
- 上拉刷新成功--->
fun refreshFooterSuccess()
- 上拉刷新失败--->
fun refreshFooterFailure()
- 上拉没有过多数据--->
fun refreshFooterEnd()
参考
val a = ItemTouchHelper(object : ItemTouchHelper.Callback() {
override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
/*
你需要重写getMovementFlags()方法来指定可以支持的拖放和滑动的方向。
使用helperItemTouchHelper.makeMovementFlags(int, int)来构造返回的flag。
这里我们启用了上下左右两种方向。注:上下为拖动(drag),左右为滑动(swipe)。
*/
val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
return makeMovementFlags(dragFlags, swipeFlags)
}
//看自己需求重不重写这个方法
override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) {
if (viewHolder == null) {
return
}
super.onSelectedChanged(viewHolder, actionState)
//actionState状态是否改变, 正常状态ItemTouchHelper#ACTION_STATE_IDLE,
// 侧滑状态ItemTouchHelper#ACTION_STATE_SWIPE,
// 拖动状态ItemTouchHelper#ACTION_STATE_DRAG
//viewHolder.itemView.setBackgroundColor(Color.YELLOW)
}
//同上面一个方法成对出现
override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) {
super.clearView(recyclerView, viewHolder)
//在一个view被拖拽然后被放开的时候被调用,同时也会在滑动被取消或者完成ACTION_STATE_IDLE)的时候被调用。
//这里是恢复item view idle状态的典型地方。
}
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
/*
移动完成后执行这个方法
*/
val startPosition = viewHolder.adapterPosition
val endPosition = target.adapterPosition
//更新移动位置信息 调用 更改数据(遍历开始位置到结束位置,两两切换位置。千万不要只调用一次Collections.swap(data,startPosition,endPosition))
// 和 adapter.notifyItemMoved(startPosition, endPosition)
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
/*
侧滑删除完成执行这个方法
*/
//获得删除的位置信息
val position = viewHolder.adapterPosition
//更新数据 调用 更改数据 和 adapter.notifyItemRemoved()
}
//开始拖动两种方法:1。长按拖动->重写方法isLongPressDragEnabled()方法中返回true;2。调用ItemTouchHelper.startDrag(RecyclerView.ViewHolder) 方法来开始一个拖动
//滑动也是两种:1。重写方法sItemViewSwipeEnabled()中返回true;2。ItemTouchHelper.startSwipe(RecyclerView.ViewHolder)
})
//必需通过attachToRecyclerView把itemTouchHelp 附加到 Rv上去
a.attachToRecyclerView(mRv)