背景
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的时候部分方法是容易爆红的,但是不影响使用容,例如:
-
明明有这个方法但是还爆红!我也不知道咋肥事~期间还用了强转型(虽然知道它没用,但它的确没有用,还是得试试!)