RecyclerViewAdapter
Android RecyclerView 通用适配器,支持多ViewType,嵌套Section,悬浮吸顶Section,可添加HeaderView、FooterView、EmptyView,底部自动加载更多,自定义Item动画
Install / Use
/learn @LwkCoder/RecyclerViewAdapterREADME
RecyclerViewAdapter
【不再维护,如有bug、需求,请自行clone源码修改】
想了解该框架的可参考以下博客说明:<br /> CSDN:http://blog.csdn.net/lwk520136/article/details/70787798<br /> 简书:http://www.jianshu.com/p/c86a39f4e811
引用方式
【最新版本号以这里为准】 <br />
由于JCenter关闭服务,从1.4.5版本开始改为发布到MavenCentral,引用方式有更新!!! <br /> 由于JCenter关闭服务,从1.4.5版本开始改为发布到MavenCentral,引用方式有更新!!! <br /> 由于JCenter关闭服务,从1.4.5版本开始改为发布到MavenCentral,引用方式有更新!!! <br />
#last-version请查看上面的最新版本号
#只支持AndroidX
#从1.4.5版本开始GroupId、ArtifactId均有更新,请按如下方式引用
implementation "com.lwkandroid.library:rcvadapter:last-version"
基础功能
- 快速实现适配器,支持多种ViewType模式
- 支持添加HeaderView、FooterView、EmptyView
- 支持滑到底部加载更多
- 支持每条Item显示的动画
- 支持嵌套Section(1.1.0版本新增)
- 支持悬浮标签StickyLayout(1.2.0版本新增)
效果图
<br/>
<br/>
<br/>
<br/>
<br/>
使用方式
1. 当Item样式一样时,只需继承RcvSingleAdapter<T>即可,示例:
public class TestSingleAdapter extends RcvSingleAdapter<TestData>
{
public TestSingleAdapter(Context context, List<TestData> datas)
{
super(context, android.R.layout.simple_list_item_1, datas);
}
@Override
public void onBindView(RcvHolder holder, TestData itemData, int position)
{
//在这里绑定UI和数据,RcvHolder中提供了部分快速设置数据的方法,详情请看源码
holder.setTvText(android.R.id.text1, itemData.getContent());
}
}
<br/>
2. 当Item样式不一样时,即存在多种ViewType类型的Item,需要将每种ViewType的Item单独实现,再关联到RcvMultiAdapter<T>中,示例:
//第一步:每种Item分别继承RcvBaseItemView<T>
public class LeftItemView extends RcvBaseItemView<TestData>
{
@Override
public int getItemViewLayoutId()
{
//这里返回该Item的布局id
return R.layout.layout_item_left;
}
@Override
public boolean isForViewType(TestData item, int position)
{
//这里判断何时引用该Item
return position % 2 == 0;
}
@Override
public void onBindView(RcvHolder holder, TestData testData, int position)
{
//在这里绑定UI和数据,RcvHolder中提供了部分快速设置数据的方法,详情请看源码
holder.setTvText(R.id.tv_left, testData.getContent());
}
}
//第二步:将所有Item关联到适配器中
public class TestMultiAdapter extends RcvMultiAdapter<TestData>
{
public TestMultiAdapter(Context context, List<TestData> datas)
{
super(context, datas);
//只需在构造方法里将所有Item关联进来,无论多少种ViewType都轻轻松松搞定
addItemView(new LeftItemView());
addItemView(new RightItemView());
}
}
<br />
3.优雅的添加HeaderView、FooterView、EmptyView,只需要在RecyclerView设置LayoutManager后调用相关方法即可:
//要先设置LayoutManager
mRecyclerView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
//添加HeaderView(若干个)
mAdapter.addHeaderView(headerView01,headerView02,headerView03...);
//添加FooterView(若干个)
mAdapter.addFooterView(footerView01,footerView02,footerView03...);
//添加EmptyView(只能设置一个)
//设置了EmptyView后,当数据量为0的时候会显示EmptyView
mAdapter.setEmptyView(emptyView);
或者
mAdapter.setEmptyView(layoutId);
<br />
4.设置滑动到底部自动加载更多,先上示例代码吧:
自1.4.3版本开始删除了之前的调用方式
//可以先设置加载样式,继承RcvBaseLoadMoreView实现自定义样式
//不设置的话会使用默认的样式,参考RcvDefLoadMoreView源码
RcvDefLoadMoreView loadMoreView = new RcvDefLoadMoreView.Builder()
.setBgColor(Color.GREEN)
.setTextColor(Color.RED)
.build(this);
mAdapter.setLoadMoreLayout(loadMoreView);
//再开启并设置监听
mAdapter.enableLoadMore(true);
mAdapter.setOnLoadMoreListener(RcvLoadMoreListener listener);
//禁止加载更多,通常用在配合下拉刷新的过程中
mAdapter.enableLoadMore(false);
注: <br />
① 默认的样式实现是类RcvDefLoadMoreView <br />
② 如需自定义样式,只需继承RcvBaseLoadMoreView,只要重写各状态UI的实现,无须关心状态切换,可参考RcvDefLoadMoreView内的实现方式。
<br />
5.设置Item显示动画,先直接上代码:
//使用默认的动画(Alpha动画)
mAdapter.enableItemShowingAnim(true);
//使用自定义动画
mAdapter.enableItemShowingAnim(true, ? extends RcvBaseAnimation);
注: <br />
①默认动画的实现是类RcvAlphaInAnim <br />
②自定义样式需要继承RcvBaseAnimation,可参考RcvAlphaInAnim内部实现。
<br />
6.设置Item点击监听:
//设置OnItemClickListener
mAdapter.setOnItemClickListener(new RcvItemViewClickListener<TestData>()
{
@Override
public void onItemViewClicked(RcvHolder holder, TestData testData, int position)
{
//onClick回调
}
});
//设置OnItemLongClickListener
mAdapter.setOnItemLongClickListener(new RcvItemViewLongClickListener<TestData>()
{
@Override
public void onItemViewLongClicked(RcvHolder holder, TestData testData, int position)
{
//onLongClick回调
}
});
<br />
7. 添加分割线,直接上代码:
1.2.9版本针对分割线进行了重写,原有方法不变,新增支持自定义颜色和部分快速创建的方法:
#适用于LinearLayoutManager
//创建默认竖直排列的分割线
RcvLinearDecoration.createDefaultVertical(Context context);
//创建自定义色值默认竖直排列的分割线
RcvLinearDecoration.createDefaultVertical(int color);
//创建默认水平排列的分割线
RcvLinearDecoration.createDefaultHorizontal(Context context);
//创建自定义色值默认水平排列的分割线
RcvLinearDecoration.createDefaultHorizontal(int color);
//构造方法:默认Drawable分割线
new RcvLinearDecoration(Context context, int orientation);
//构造方法:自定义Drawable分割线
new RcvLinearDecoration(Context context, Drawable drawable, int orientation);
//构造方法:自定义Drawable分割线
new RcvLinearDecoration(Context context, @DrawableRes int drawableResId, int orientation);
//构造方法:自定义Color分割线(宽度或者高度默认1px)
new RcvLinearDecoration(@ColorInt int color, int orientation);
//构造方法:自定义Color分割线
new RcvLinearDecoration(@ColorInt int color, int size, int orientation);
#适用于GridLayoutManager、StaggeredGridLayoutManager
//创建默认分割线
RcvGridDecoration.createDefault(Context context);
//创建自定义色值默认分割线
RcvGridDecoration.createDefault(int color);
//构造方法:默认Drawable的分割线
new RcvGridDecoration(Context context);
//构造方法:自定义Drawable的分割线
new RcvGridDecoration(Context context, Drawable drawable);
//构造方法:自定义Drawable的分割线
new RcvGridDecoration(Context context, @DrawableRes int drawableResId);
//构造方法:自定义Color的分割线(默认分割线宽高均为1px)
new RcvGridDecoration(@ColorInt int color);
//构造方法:自定义Color的分割线
new RcvGridDecoration(@ColorInt int color, int width, int height);
注: <br /> ①是直接设置给RecyclerView的,不是设置给适配器的,不要看错哦<br /> ②支持自定义drawable当分割线 <br />
8.嵌套Section,稍微复杂一点,配合代码讲解:
1.4.0版本开始删除以前的使用方法,采用下面的方式
带有Section功能的适配器为RcvSectionMultiLabelAdapter和RcvSectionSingleLabelAdapter,需要指定两个泛型,第一个代表Section,第二个代表普通数据Data,
两者都支持多种Data类型的子布局,唯一不同的是,RcvSectionMultiLabelAdapter还支持多种Section类型的子布局,但不可以和RcvStickyLayout联动,而RcvSectionSingleLabelAdapter
仅支持一种Section类型的子布局,但是可以和RcvStickyLayout联动。需要注意的是,传给适配器的数据均需要自行预处理,用RcvSectionWrapper封装后才可传入适配器。
#只有一种Section类型,配合多种Data类型的适配器
public class TestSectionAdapter extends RcvSectionSingleLabelAdapter<TestSection, TestData>
{
public TestSectionAdapter(Context context, List<RcvSectionWrapper<TestSection, TestData>> datas)
{
super(context, datas);
}
@Override
protected RcvBaseItemView<RcvSectionWrapper<TestSection, TestData>>[] createDataItemViews()
{
return new RcvBaseItemView[]{new DataItemView01(), new DataItemView02()};
}
@Override
public int getSectionLabelLayoutId()
{
return R.layout.layout_section_label;
}
@Override
public void onBindSectionLabelView(RcvHolder holder, TestSection section, int position)
{
holder.setTvText(R.id.tv_section_label, section.getSection());
}
//第一种Data ItemView
private class DataItemView01 extends RcvBaseItemView<RcvSectionWrapper<TestSection, TestData>>
{
@Override
public int getItemViewLayoutId()
{
return R.layout.adapter_item_long;
}
@Override
public boolean isForViewType(RcvSectionWrapper<TestSection, TestData> item, int position)
{
return !item.isSection() && item.getData().getType() == 0;
}
@Override
public void onBindView(RcvHolder holder, RcvSectionWrapper<TestSection, TestData> wrapper, int position)
{
TextView textView = holder.findView(R.id.tv_item_long);
textView.setBackgroundColor(Color.GREEN);
textView.setText("第一种数据类型:" + wrapper.getData().getContent());
}
}
//第二种Data ItemView
private class DataItemView02 extends RcvBaseItemView<RcvSectionWrapper<TestSection, TestData>>
{
@Override
public int getItemViewLayoutId()
{
return R.layout.adapter_item_short;
}
@Override
public boolean isForViewType(RcvSectionWrapper<TestSection, TestData> item, int position)
{
return !item.isSection() && item.getData().getType() != 0;
}
@Override
public void onBindView(RcvHolder holder, RcvSectionWrapper<TestSection, TestData> wrapper, int position)
{
TextView textView = holder.findView(R.id.tv_item_short);
textView.setBackgroundColor(Color.RED);
textView.setText("第二种数据类型:" + wrapper.getData().getContent());
}
}
}
#多种Section类型,配合多种Data类型的适配器
public class TestSectionMultiLabelAdapter extends RcvSectionMultiLabelAdapter<TestSection, TestData>
{
public TestSectionMultiLabelAdapter(Context context, List<RcvSectionWrapper<TestSection, TestData>> datas)
{
super(context, datas);
}
@Override
protected RcvBaseItemView<RcvSectionWrapper<TestSection, TestData>>[] createLabelItemViews()
{
return new RcvBaseItemView[]{new LabelItemView01(), new LabelItemView02()};
}
@Override
protected RcvBaseItemView<RcvSectionWrapper<TestSection, TestData>>[] createDataItemViews()
{
return new RcvBaseItemView[]{new DataItemView01(), new DataItem
Related Skills
node-connect
341.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.5kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
341.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.5kCommit, push, and open a PR
