分析时候的思路
书写类型初稿:
Adapter
1 2 3 4 5 6 7 8 9 10 11
| new Adatper(context,data){ o.getStyle()<——可不写 } .addViewHold(ViewHolder)//为default .addViewHold(style,viewHolder) .addFooterHold(ViewHolder/resId) .addHeaderHold(ViewHolder/resId) .addEmptyHold(ViewHolder/resId)//支持emptyHold .add上啦Hold(ViewHolder)//貌似应该放入 zrfresh的逻辑中. ZRefresh loadMore可以和他联动? .notify系列//notify之间 自动计算动画? 看看diffuitl工具 .relaeList(rv)
|
ViewHolder
1 2 3 4
| ViewHolder public itemView int getLayoutId() update(postion,data ,helper)
|
封装后的简单实用
QuickRcvAdapter范例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| IAdapter<String> muliAdapter = new QuickRcvAdapter(this, mDatas){ @Override protected int getItemViewType2(int dataPosition) { //此方法可以默认 设置不写, 默认值返回Wrapper.DEFAULT_VALUE(-1) return dataPosition % 2; } } .addViewHolder(new LeftDelegates())//默认 .addViewHolder(0, new LeftDelegates()) //多布局 .addViewHolder(1, new RightDelegates())//多布局 .addHeaderHolder(R.layout.header_simple)//资源 .addHeaderHolder(ViewDelegates footer)//也可以的 .addFooterHolder(R.layout.footer_simple)//资源 .addFooterHolder(ViewDelegates footer)//也可以的 .addEmptyHold(R.layout.empty)//也支持empty 资源 .addEmptyHold(ViewDelegates emtpy)//也支持empty .setOnItemClickListener(new IAdapter.OnItemClickListener() { @Override public void onItemClick(ViewGroup parent, View view, int position) { System.out.println("被点击->onItemClick" + position); } }) .setOnItemLongClickListener(new IAdapter.OnItemLongClickListener() { @Override public boolean onItemLongClick(ViewGroup parent, View view, int position) { System.out.println("被点击->onItemLongClick:" + position); return true; } }) .addOnScrollListener(scroller = new OnScrollRcvListenerEx(new OnScrollRcvListenerEx.LoadMoreCallback() { @Override public void loadMore() { //这个类主要是为了和我的ZRefresh库兼容。我会委托上啦加载在这里处理! } })) .relatedList(rv)
|
ViewDelegates范例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class LeftDelegates extends ViewDelegates<String> {
@Override public int getLayoutId() { return R.layout.item_left; }
@Override public void fillData(int postion, String data, Helper helper) { ExtraHelper.wrapper(helper).setText(R.id.tv, data).heihei().heihei2() .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { System.out.println("helper click测试 "); } }, new int[]{R.id.tv, R.id.ll_main}); ; } }
|
Helper的扩展技巧:扩展技巧是 装饰模式+链式调用+泛型
使用起来:ExtraHelper.wrapper(helper).setText(R.id.tv, data).heihei().heihei2();
实现方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class ExtraHelper extends Helper<ExtraHelper> {
private ExtraHelper(Helper helper) { super(helper.getContext(), helper.getHolder(),helper.getAdapter()); child = this; }
public static ExtraHelper wrapper(Helper helper){ return new ExtraHelper(helper); }
public ExtraHelper heihei() { System.out.println("heihei!"); checkChild(); return child; }
public ExtraHelper heihei2() { System.out.println("heihei2!"); checkChild(); return child; } }
|
全局配置
新裤暂时就支持这点~
(原型模式-下拉刷新的全局设置)[https://luhaoaimama1.github.io/2017/04/04/Refresh/]
1 2
| //全局替换加载更多 QuickConfig.build().setLoadMoreDelegates(ILoadMoreDelegates iLoadMoreDelegates).perform();
|
加载更多联动ZRefresh库
其实是ZRefresh把加载更多的功能委托出去而已
参考范例
最后建议看看
很美观一个库 https://github.com/GcsSloop/diycode
看完Diycode的总结:
adapter重构(因为我原来写了adapter,看完这个库后推到重写adapter3)
headerFooterView功能
单独分离出一个类,既多类型复用。
数据并用helper定制图片加载等其他的逻辑
特点: 可复用,绑定数据
刷新控件与fragment的结合 ,布局结合 ?
这样有点耦合了 怎么才能 不耦合的处理?
刷新加载逻辑和网络请求 基类统一处理。
有点类似我这个库,一直很少维护就是纠结啊,Ps:并且可以全局更换网络请求库
给我以灵感:网络请求 是 通过请求 异步+eventbus?
这样多个注册了Subscribe的页面同时存活,其中一个请求。另一个页面也会处理相同的数据,会不会凌乱呢?
不过这个确实很美观。我很喜欢 可以有一点缺憾,如果eventBus多支持一个方法,只在本类分发接受就好了~
工具类
DataCache,FileUtil,DataCleanManager,UrlUtil,ACache,CacheUtil,UUIDGenerator
SpeedyLinearLayoutManager
灵感,不错的方法
public void setOnClickListener(View.OnClickListener l, int… ids)
复杂的书写格式
非与或非的符号则用此格式
1 2 3 4
| String a, String b, String c, String d,
|
Reference&Thanks:
https://github.com/GcsSloop/diycode