添加依赖

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()

Logo

秉承“创新、开放、协作、共享”的开源价值观,致力于为大规模开源开放协同创新助力赋能,打造创新成果孵化和新时代开发者培养的开源创新生态!支持公有云使用、私有化部署以及软硬一体化私有部署。

更多推荐