1.Mimo项目中
ByRecyclerView
开源项目地址:https://github.com/youlookwhat/ByRecyclerView
简介
RecyclerView 下拉刷新、上拉松手/自动加载更多、item点击/长按、item局部刷新、头布局/尾布局/状态布局、万能分割线、Skeleton骨架图、极简adapter、嵌套滑动置顶
1.1 快速开始( 基础的可以直接看帖子,这里可以直接看干货)
1.1.1 先在 build.gradle 的 repositories 添加
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
1.1.2 然后在dependencies添加
dependencies {
// AndroidX版本引入
implementation 'com.github.youlookwhat:ByRecyclerView:1.4.1'
}
1.1.3 在XML布局中引用 ByRecyclerView
<me.jingbin.library.ByRecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layoutManager="LinearLayoutManager"
tools:listitem="@layout/item_main" />
1.1.4 使用BaseRecyclerAdapter
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(new BaseRecyclerAdapter<String>(R.layout.item_main, list) {
@Override
protected void bindView(BaseByViewHolder<String> holder, String bean, int position) {
holder.setText(R.id.tv_text, bean);
}
});
mAdapter.setNewData(list); // 设置第一页数据
1.1.5 设置监听
// 下拉刷新监听
mRecyclerView.setOnRefreshListener(new ByRecyclerView.OnRefreshListener() {
@Override
public void onRefresh() {
// 刷新完成
mRecyclerView.setRefreshing(false);
}
});
// 加载更多监听
// 下拉刷新监听
mRecyclerView.setOnRefreshListener(new ByRecyclerView.OnRefreshListener() {
@Override
public void onRefresh() {
// 刷新完成
mRecyclerView.setRefreshing(false);
}
});
// 加载更多监听
mRecyclerView.setOnLoadMoreListener(new ByRecyclerView.OnLoadMoreListener() {
@Override
public void onLoadMore() {
mAdapter.addData(list); // 设置及刷新数据
mRecyclerView.loadMoreComplete(); // 加载更多完成
mRecyclerView.loadMoreEnd(); // 没有更多内容了
mRecyclerView.loadMoreFail(); // 加载更多失败,点击重试
}
});
1.2 干货
1.2.1 BaseByRecyclerViewAdapter
BaseByRecyclerViewAdapter<T, K extends BaseByViewHolder>
其中 class BaseByViewHolder<T>
所以子类继承的时候这样写:
:BaseByRecyclerViewAdapter<ChatAdapter.MessageData,BaseByViewHolder<ChatAdapter.MesageData>>()
支持多type的item
需要复写的函数有:
1.2.1.1 getItemViewType
控制当前item的viewtype
override fun getItemViewType(position: Int): Int {
val message = getItemData(position).msg
1.2.1.2 onCreateViewHolder
给每个viewtype设置不同的ViewHolder, 其中ViewHolder的入参可以根据自己需求进行添加,itemview这项一定要传,需要作为入参传递给BaseViewHolder中
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): BaseByViewHolder<MessageData> {
mContext = parent.context
return when (viewType) {
TYPE_MSG_TIME -> TimeHolder(LayoutInflater.from(mContext).inflate(R.layout.item_chat_tip_text, parent, false))
TYPE_MSG_SEND -> ItemHolder(this, LayoutInflater.from(mContext).inflate(R.layout.item_chat_send, parent, false), listener)
TYPE_MSG_RECEIVE -> ItemHolder(this, LayoutInflater.from(mContext).inflate(R.layout.item_chat_receive, parent, false), listener)
else -> SystemHolder(this, LayoutInflater.from(mContext).inflate(R.layout.item_chat_system, parent, false), listener)
}
}
1.2.1.3 onBaseBindView
每种viewtype对应的ViewHolder进行数据绑定时调用
Called by RecyclerView to display the data at the specified position
class TimeHolder(itemView: View) : BaseByViewHolder<MessageData>(itemView) {
override fun onBaseBindView(holder: BaseByViewHolder<MessageData>, bean: MessageData?, position: Int) {
val time = bean?.time ?: return
(holder.itemView as TextView).let {
it.text = TimeUtil.getTimeString(it.context, time)
}
}
}
1.2.2 BaseRecyclerAdapter
单一 item 类型 adapter
核心函数:
1.2.2.1 bindView
class AddMoreAdapter(var list: List<KeyboardAddMoreEnum>): BaseRecyclerAdapter<KeyboardAddMoreEnum>(
R.layout.item_keyboard_add_more, list) {
override fun bindView(holder: BaseByViewHolder<KeyboardAddMoreEnum>, bean: KeyboardAddMoreEnum, position: Int) {
val ivIcon: ImageView = holder.getView(R.id.ivIcon)
val tvName: TextView = holder.getView(R.id.tvName)
ivIcon.setImageResource(bean.icon)
tvName.text = tvName.context.getText(bean.textRes)
}
}
2.ILink项目中
** BaseRecyclerViewAdapterHelper**
2.1 导入
implementation "io.github.cymchad:BaseRecyclerViewAdapterHelper4:4.1.4"