添加依赖
github主页https://github.com/CymChad/BaseRecyclerViewAdapterHelper
在build.gradle中添加代码 ,使用3.0版本,不用最新的4.0版本
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50'
在gradle.properties里面添加属性
android.enableJetifier=true
低版本gradle:将JitPack存储库添加到您的构建文件中(项目根目录下build.gradle文件)
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
高版本gradle:需要在settings.gradle里面配置
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
单布局使用方法
自定义adapter继承BaseQuickAdapter
/**
* 单个viewtype适用
* 1.adapter 继承自BaseQuickAdapter
* 包括2个泛型,第一个为数据的类型,第二个为viewHolder的类型,固定写 BaseViewHolder即可
*
* 2.需要添加一个构造方法
*/
public class ProvinceAdapter extends BaseQuickAdapter<ProvinceEntity, BaseViewHolder> {
public ProvinceAdapter() {
super(R.layout.item_province);
}
@Override
protected void convert(@NonNull BaseViewHolder baseViewHolder, ProvinceEntity provinceEntity) {
ItemProvinceBinding binding = ItemProvinceBinding.bind(baseViewHolder.itemView);
binding.tvProvince.setText(provinceEntity.getProvince());
}
}
给adapter设置数据(setNewData)
ProvinceVM vm = new ViewModelProvider(this).get(ProvinceVM.class);
vm.mDataList.observe(this, new Observer<List<ProvinceEntity>>() {
@Override
public void onChanged(List<ProvinceEntity> provinceEntities) {
adapter.setNewData(provinceEntities);
}
});
得到列表的数据(getData)
List<CategoryMember> data = mAdapter.getData();
处理item的点击事件(setOnItemClickListener)
adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(@NonNull BaseQuickAdapter adapter, @NonNull View view, int position) {
ProvinceEntity item = (ProvinceEntity) adapter.getItem(position);
ToastUtil.show(AdapterStudyActivity.this, "点了 " + item.getProvince());
}
});
处理item的子view点击事件(addOnClickListener)
在adapter中注册要监听的子view的id,在convert方法中使用ViewHolder注册
baseViewHolder.addOnClickListener(R.id.ic_collect, R.id.tv_province, R.id.ic_comment, R.id.ic_dianzan);
然后再activity中添加监听器(setOnItemChildClickListener)
//添加item子view的点击事件
adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(@NonNull BaseQuickAdapter adapter, @NonNull View view, int position) {
//view:被点击的子view
if (view.getId() == R.id.ic_collect) {
ToastUtil.show(AdapterStudyActivity.this, "点了图标 ");
} else if (view.getId() == R.id.tv_province) {
ToastUtil.show(AdapterStudyActivity.this, "点了文字");
} else if (view.getId() == R.id.ic_comment) {
ToastUtil.show(AdapterStudyActivity.this, "点了评论");
} else if (view.getId() == R.id.ic_dianzan) {
ToastUtil.show(AdapterStudyActivity.this, "点了点赞");
}
}
});
多布局使用方法
多个viewtype
1.adapter 继承自BaseMultiItemQuickAdapter
包括2个泛型,第一个为数据的类型,第二个为viewHolder的类型,固定写BaseViewHolder即可
2.数据的实体需要implements(实现)自MultiItemEntity,并实现getItemType()
3.多布局需要手动添加多个布局,通过addItemType方法,第一个参数type,对应entity里面的getItemType方法的返回值,第二个参数为对应的item布局
convert方法中需要根据baseViewHolder.getItemViewType(),动态的填充数据
/**
* 多个viewtype<p/>
* adapter 继承自BaseMultiItemQuickAdapter<p/>
* 包括2个泛型,第一个为数据的类型,第二个为viewHolder的类型,固定写BaseViewHolder即可<p/>
* 数据的实体需要继承自MultiItemEntity<p/>
*
* 多布局需要手动添加多个布局,通过addItemType方法,第一个参数type,对应entity里面的getItemType方法的返回值,第二个参数为对应的item布局<p/>
*
* convert方法中需要根据baseViewHolder.getItemViewType(),动态的填充数据<p/>
*
*/
public class ProvinceAdapter2 extends BaseMultiItemQuickAdapter<ProvinceEntity, BaseViewHolder> {
public ProvinceAdapter2() {
super(null);
addItemType(0, R.layout.item_province);
addItemType(1, R.layout.item_province2);
addItemType(2, R.layout.item_province3);
}
@Override
protected void convert(@NonNull BaseViewHolder baseViewHolder, ProvinceEntity provinceEntity) {
//注册自view的点击事件
baseViewHolder.addOnClickListener(R.id.ic_collect, R.id.tv_province, R.id.ic_comment, R.id.ic_dianzan);
int itemViewType = baseViewHolder.getItemViewType();
switch (itemViewType) {
case 0:
{
ItemProvinceBinding binding = ItemProvinceBinding.bind(baseViewHolder.itemView);
binding.tvProvince.setText(provinceEntity.getProvince());
}
break;
case 1:
{
ItemProvince2Binding binding = ItemProvince2Binding.bind(baseViewHolder.itemView);
binding.tvProvince.setText(provinceEntity.getProvince());
}
break;
case 2:
{
ItemProvince3Binding binding = ItemProvince3Binding.bind(baseViewHolder.itemView);
binding.tvProvince.setText(provinceEntity.getProvince());
}
break;
}
}
}
/**
* 多布局的实体需要实现MultiItemEntity接口
* 实现getItemType方法,返回entity的布局类型
*/
public class ProvinceEntity implements MultiItemEntity {
private String id;
private String province;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
@Override
public int getItemType() {
return Integer.parseInt(id) % 3;//0,1,2
//如果有种类:可直接返回种类
}
}
对于数据变化的监听:
registerAdapterDataObserver(适配器数据改变监听)
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
notifyItemChanged
notifyItemChanged(int position, @Nullable Object payload)
使用可选的有效负载对象通知任何已注册的观察者该position的项目已更改
adapter.notifyItemChanged(position, new Object())
adapter里有重写方法:convertPayloads()需要单独更新的可以写在这里
@Override
protected void convertPayloads(@NonNull BaseViewHolder helper, PhotoEntity item, @NonNull List<Object> payloads) {
super.convertPayloads(helper, item, payloads);
notifyItemRangeChanged
adapter.notifyItemRangeChanged(0, adapter.getItemCount(), new Object());
走adapter里的重写方法:convertPayloads()需要单独更新的可以写在这里
notifyDataSetChanged
adapter.notifyDataSetChanged();
走adapterl里的convert()
BaseQuickAdapter的一些常用方法
//列表数据
public List<T> getData() {
return mData;
}
//返回:指定位置的数据
public T getItem(@IntRange(from = 0) int position) {
if (position >= 0 && position < mData.size())
return mData.get(position);
else
return null;
}
//得到条目的数量
public int getItemCount() {
int count;
if (1 == getEmptyViewCount()) {
count = 1;
if (mHeadAndEmptyEnable && getHeaderLayoutCount() != 0) {
count++;
}
if (mFootAndEmptyEnable && getFooterLayoutCount() != 0) {
count++;
}
} else {
count = getHeaderLayoutCount() + mData.size() + getFooterLayoutCount() + getLoadMoreViewCount();
}
return count;
}
//设置条目点击
public void setOnItemClick(View v, int position) {
getOnItemClickListener().onItemClick(BaseQuickAdapter.this, v, position);
}
//recyclerview
public final int getAdapterPosition()
更多推荐