【Android】第三方库BaseRecyclerViewAdapterHelper的版本3和版本2的差异学习

背景

BaseRecyclerViewAdapterHelper这个东西我也是在项目更新迭代的时候才第一次接触。收集相关资料,这是一个优秀的第三方库
在这里插入图片描述
其中版本3是采用kt构建的:
在这里插入图片描述

但是原来的项目是老版本的:
在这里插入图片描述
那么我就想将原来的代码进行升级改造!想将这些老旧的代码升级为最新的3.0.7版。但是有遇到相关的问题,可能也不是咱的问题,也许是Android studio本身的问题。

过程

首先post基础的代码:这个代码对单选和多选进行适配的BaseAdapter

import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.viewholder.BaseViewHolder;
import java.util.ArrayList;
import java.util.List;

/**
 * 单选和多选的BaseAdapter
 */
public abstract class BaseSelectAdapter<T, K extends BaseViewHolder> extends BaseQuickAdapter<T, K> {

    private List<T> multiSelectList;
    protected int currentSelectItemPosition = -1;
    private MultiSelectAction<T> selectAction;
    private SelectType currentType;

    public BaseSelectAdapter(int layoutResId, @Nullable List<T> data) {
        super(layoutResId, data);
    }

    @Override
    protected void convert(K helper, T item) {
        boolean isSelect = false;
        switch (currentType) {
            case multi:
                isSelect = getMultiSelectItems().contains(item);
                break;
            case single:
                isSelect = (currentSelectItemPosition == helper.getBindingAdapterPosition());
                break;
        }
        selectConvert(isSelect, helper, item);
    }

    /**
     * 点击Item的通知
     *
     * @param position
     */
    public void notifySelect(int position,boolean canselSelect) {
        if (getData() == null || getData().size() == 0 || position >= getData().size()) {
            return;
        }
        switch (currentType) {
            case single:
                if(currentSelectItemPosition == position && canselSelect){  //点击同一个按钮的时候,选中效果取消
                    currentSelectItemPosition = -1;
                    notifyItemChanged(position);
                }else {
                    int temp = currentSelectItemPosition;
                    currentSelectItemPosition = position;
                    notifyItemChanged(temp);
                    notifyItemChanged(position);
                }
                break;
            case multi:

                T item = getData().get(position);
                boolean isSelect = getMultiSelectItems().contains(item);
                if (!isSelect) {
                    getMultiSelectItems().add(item);
                } else {
                    getMultiSelectItems().remove(item);
                }
                notifyItemChanged(position);
                break;
            default:
                break;
        }
    }

    public BaseSelectAdapter setMultiSelectList(List<T> multiSelectList) {
        this.multiSelectList = multiSelectList;
        return this;
    }

    public BaseSelectAdapter setCurrentSelectItemPosition(int currentSelectItemPosition) {
        this.currentSelectItemPosition = currentSelectItemPosition;
        return this;
    }

    public BaseSelectAdapter<T, K> setCurrentType(SelectType currentType) {
        this.currentType = currentType;
        return this;
    }

    public BaseSelectAdapter setMultiSelectAction(MultiSelectAction<T> selectAction) {
        this.selectAction = selectAction;
        return this;
    }

    public T getSingeSelectItem() {
        return currentSelectItemPosition < 0 ? null : getData().get(currentSelectItemPosition);
    }

    public List<T> getMultiSelectItems() {
        if (multiSelectList == null) {
            multiSelectList = new ArrayList<>();
        }
        return multiSelectList;
    }

    /**
     * @param isSelect 是否被选中
     * @param helper
     * @param item
     */
    protected abstract void selectConvert(boolean isSelect, K helper, T item);

    /**
     * 单选还是多选
     */
    public enum SelectType {
        single, multi;
    }

    /**
     * 点击item发生的改变
     *
     * @param
     */
    public interface MultiSelectAction<T> {
        // 返回true为选中,false 不选中
        boolean action(T t);
    }

}

在对这个方法(升级为最新的版本3后)深入使用的时候,原来老旧的代码会报错。
在这里插入图片描述

结果发现是通配符的问题,详细可以参考Java中的无界通配符<?>在什么时候使用

  • 这回的版本升级,导致BaseViewHolder的路径更新如下:

import com.chad.library.adapter.base.viewholder.BaseViewHolder;

这一点亏我也吃到了!

  • 其次在java面调用版本3的时候部分方法是容易爆红的,但是不影响使用容,例如:
    -在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    明明有这个方法但是还爆红!我也不知道咋肥事~期间还用了强转型(虽然知道它没用,但它的确没有用,还是得试试!)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值