(7) 盘古UI,三步出列表! 重新封装RecyclerView适配器,BaseRecyclerViewAdapter,让开发更快,使用很方便!
盘古UI,较为全面的自定义UI框架,帮助你绝对的快速开发!(长期维护中)
盘古BaseRecyclerViewAdapter
如果直接使用recyclerView加载列表会非常繁琐,这也是开发者不愿意去做但又不得不做的事情,因为实际开发中展示列表的页面随处可见,基于大家的痛点,对整个加载列表流程和代码的分析和梳理,最终整理和封装出了最简洁的这款适配器-BaseRecyclerViewAdapter,让你只需要三步就可以快速简便的写出一个列表!开发速度大大提升,代码量也大大降低,代码的整洁程度得到了质的提升,来一起看下吧!
1, 样例展示图,和原来适配器实现的效果一样
2, 使用步骤
1,布局文件
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/pg_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2,创建适配器和item
// 准备数据
List<SelectItem> selectItems = UserUtil.getSelectItems();
selectItems.addAll(selectItems);
selectItems.addAll(selectItems);
// 创建适配器
BaseRecyclerViewAdapter<SelectItem> adapter = new BaseRecyclerViewAdapter<SelectItem>(this, selectItems, new BaseRecyclerViewAdapter.Delegate<SelectItem>() {
@Override
public View buildView(ViewGroup parent, int viewType) {
return new DemoItemView(PanguRecyclerAdapterActivity.this);
}
@Override
public void bindViewData(int position, SelectItem data, View view) {
DemoItemView itemView = (DemoItemView) view;
//设置数据|做一些操作
itemView.setData(data);
}
});
3,设置适配器
mPgRecycler.setAdapter(adapter);
到此就完成了!下面是几个细节简单说明一下
DemoItemView 是item的布局,根据自己的需求可以自定义.我是使用的统一封装的BaseView 实现,效率也很高,可以参考,代码如下
public class DemoItemView extends BaseView {
@Bind(R.id.tv_title)
TextView mTvTitle;
@Bind(R.id.iv_check)
ImageView mIvCheck;
@Bind(R.id.ll_root)
LinearLayout mLlRoot;
public DemoItemView(Context context) {
super(context);
}
@Override
protected int getLayoutId() {
return R.layout.item_demo;
}
@Override
protected void initView(Context context, AttributeSet attrs, int defStyleAttr) {
ButterKnife.bind(this);
}
/**
* 设置数据的业务逻辑全在这
*
* @param bean
*/
public void setData(SelectItem bean) {
if (bean == null) {
return;
}
mTvTitle.setTextColor(bean.isSelect() ? getResources().getColor(R.color.blue_text_color) : Color.parseColor("#4E5969"));
mLlRoot.setBackgroundColor(bean.isSelect() ? Color.parseColor("#E8F1FF") : getResources().getColor(R.color.white));
mIvCheck.setVisibility(bean.isSelect() ? VISIBLE : GONE);
mTvTitle.setText(bean.getName());
}
}
3,代码封装简析
经过反复的分析和总结 ,展示一个列表其实是只需要数据+布局,所以这两个以代理模式让使用者给出就完成了最重要的封装步骤!
1,继承 RecyclerView.Adapter<BaseViewHolder>
public class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<BaseViewHolder<T>> {
2,设置代理
public void setmDelegate(Delegate<T> mDelegate) {
this.mDelegate = mDelegate;
}
3,重写需要的方法,结合代理暴露出data和view给使用者,完成封装
/**
* 绑定布局
*
* @param parent
* @param viewType
* @return 顶级ViewHolder
*/
@NonNull
@Override
public BaseViewHolder<T> onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = mDelegate.buildView(parent, viewType);
return new BaseViewHolder<T>(view);
}
/**
* 绑定ViewHolder数据,处理数据
*
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {
if (mDelegate != null) {
mDelegate.bindViewData(position, list.get(position), holder.itemView);
}
// 对条目设置点击事件回调
holder.itemView.setOnClickListener((v) -> {
if (itemClickRecyclerListener != null) {
itemClickRecyclerListener.onItemClick(position, list.get(position), holder.itemView);
}
});
holder.itemView.setOnLongClickListener((v) -> {
if (itemLongClickRecyclerListener != null) {
return itemLongClickRecyclerListener.onItemLongClick(position, list.get(position), holder.itemView);
}
return false;
});
}
4, 代码封装心得
要善于分析和总结,找到一定的规律和突破口,就是你封装的秘诀!
5, 获取地址
demo地址,点击查看github
欢迎您扫码安装体验demo