31.列表适配器 ✅❎1/2(总2种适配器)

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"
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容