场景
面对多类型的列表,应该怎么处理?
解决方案(设计思想的方法--委托者模式)
什么是委托者模式,简单的来说就是业务所需要实现的逻辑交给一个目标实现类来完成。
不管任何条目,都统一实现IDelegateAdapter接口

然后让一个实现类去完成

下面是代码实现
public interface IDelegateAdapter {
// 查找委托时调用的方法,返回自己能处理的类型即可。
boolean isForViewType(BaseRvBean baseRvBean);
// 用于委托Adapter的onCreateViewHolder方法
SuperViewHolder onCreateViewHolder(ViewGroup parent, int viewType);
// 用于委托Adapter的onBindViewHolder方法
void onBindViewHolder(RecyclerView.ViewHolder holder, int position, BaseRvBean baseRvBean);
//清除数据
void clearData();
}
由于篇幅原因,代码没有全部贴入
public class BaseRvAdapter extends RecyclerView.Adapter<SuperViewHolder> {
List<IDelegateAdapter> delegateAdapters = new ArrayList<>();
public void addDelegate(IDelegateAdapter delegateAdapter) {
delegateAdapters.add(delegateAdapter);
}
@Override
public SuperViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
IDelegateAdapter iDelegateAdapter = delegateAdapters.get(viewType);
return iDelegateAdapter.onCreateViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(SuperViewHolder holder, int position) {
int itemViewType = holder.getItemViewType();
IDelegateAdapter iDelegateAdapter = delegateAdapters.get(itemViewType);
iDelegateAdapter.onBindViewHolder(holder, position, mDataList.get(position));
}
@Override
public int getItemViewType(int position) {
BaseRvBean baseRvBean = mDataList.get(position);
for (IDelegateAdapter delegateAdapter : delegateAdapters) {
if (delegateAdapter.isForViewType(baseRvBean)) {
return delegateAdapters.indexOf(delegateAdapter);
}
}
throw new RuntimeException("没有可以处理的委托Adapter");
}
public void clear() {
mDataList.clear();
for (IDelegateAdapter delegateAdapter : delegateAdapters) {
delegateAdapter.clearData();
}
notifyDataSetChanged();
}
}
使用方法
- 实现自己业务需要的item类型
class EditTextAdapter : IDelegateAdapter {
override fun clearData() {
mTextCache.clear()
}
override fun isForViewType(baseRvBean: BaseRvBean?): Boolean {
return baseRvBean?.type == ViewType.ITEM_TYPE_GENERAL_EDITTEXT
}
@SuppressLint("InflateParams")
override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): SuperViewHolder {
val view = LayoutInflater.from(parent?.context).inflate(R.layout.view_custom_ed, null)
return ViewHolder(view)
}
private val mTextCache = SparseArray<String>()
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int, baseRvBean: BaseRvBean?) {
}
- 创建Adapter
mAdapter = BaseRvAdapter(mActivity).apply {
addDelegate(EditTextAdapter())
}
- 赋值
mAdapter?.setDataList(mDataList )\\这些都是基本操作,大家都会的
委托模式是不是很简单呀,把设计模式运用到开发中,真的是件很有意思的事情,大家都可以多尝试下
网友评论