之前有写一篇,东西很好,但是掺杂上我自己的东西,显得不太好。所以这里写一个通俗易懂,清新优雅的版本。既可以简化读者在面对大量RecyclerView时的操作,也可以让读者在阅读本文时,有所收获。
先提一个问题,为什么要写一个BaseRecyclerViewFragment?有这个必要吗?
如果你的项目中会出现大量的RecyclerView,我觉得是有必要的,不仅仅是减少你的代码量和增加你的条理,更是方便了之后需求的修改以及维护。
这里我们拿开源中国的app举个例子。
他的页面像图1由大量RecyclerView堆砌而成,而右边那张图是他仅仅一个综合模块的所有RecyclerView。也就是说这个app光第一部分就有几十个RecyclerView!如果你不能建造一个BaseRecyclerViewFragment来很好地管理所有的RecyclerView的话,后果可想而知。而事实证明,他们的源代码里确实存在着这样一个base类。
怎么设计这样一个BaseRecyclerViewFragment呢?
很简答,你只需要通过抽象方法,把所有需要的东西都交给子类去实现,在父类中帮他省去多余代码。最重要的是,对于数据的绑定操作、对于控件的设置图片,文字,监听都是通过抽象方法!!!这种便利性可想而知。
首先最上面有个泛型<T>,指代你要传入的数据类型。如果是纯文字,String,如果有更多个性化的需求,传JavaBean。public abstract class BaseRecyclerViewFragment<T> extends Fragment { protected abstract RecyclerView getRecyclerView(); protected abstract RecyclerView.LayoutManager getLinearLayoutManager(); protected abstract int getLayoutId(); protected abstract List<T> getList(); protected abstract void operate(ViewHolder holder, T t, int position); @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { RecyclerView mRv = getRecyclerView(); RecyclerView.LayoutManager manager = getLinearLayoutManager(); CommonAdapter mAdapter = new CommonAdapter<T>(getContext(),getLayoutId(),getList() ) { @Override protected void convert(ViewHolder holder, T t, int position) { operate(holder, t, position); } }; mRv.setLayoutManager(manager); mRv.setAdapter(mAdapter); return null; } }
之后就是定义了几个抽象方法
1.获取RecyclerView
2.获取LayoutManager
3.获取item的布局id
4.获取List数据
5.获取数据绑定、控件使用操作
至于Adapter,直接采用鸿洋的万能Adapter(虽然抽象出来这个万能的Adapter很简单,但是为了减少读者的工作量,直接添加gradle)
compile 'com.android.support:recyclerview-v7:25.3.1' compile 'com.zhy:base-rvadapter:3.0.3'
这样一来,子类就显得无比的清爽了。
public class RvTestFragment extends BaseRecyclerViewFragment<String> { private RecyclerView mRvTest; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_rv_test, container, false); mRvTest = (RecyclerView) v.findViewById(R.id.rv_test); super.onCreateView(inflater, container, savedInstanceState); return v; } @Override protected RecyclerView getRecyclerView() { return mRvTest; } @Override protected RecyclerView.LayoutManager getLinearLayoutManager() { return new LinearLayoutManager(getActivity()); } @Override protected int getLayoutId() { return R.layout.item_rv; } @Override protected List<String> getList() { List<String> list = new ArrayList<>(); for (int i = 0; i < 30; i++) { list.add(i + ""); } return list; } @Override protected void operate(ViewHolder holder, String s, int position) { TextView t = holder.getView(R.id.tv_test); t.setText(s); } }
1.在最上面指定这个泛型,我们这里用的是String。
2.还有值得一提的就是最后这个operate
TextView t = holder.getView(R.id.tv_test);取得控件
t.setText(s)
搞定!
3.还有一个涨姿势的小细节
在onCreateView中调用super.onCreateView(inflater, container, savedInstanceState);的位置。因为这句话等于是执行了父类的onCreateView方法。如果你把他放在最上面声明,那么肯定会出现找不到RecyclerView的现象。
效果图
除了究极简化RecyclerView的代码量之外,你还可以在这个BaseRecyclerViewFragment中进行比如:
1.下拉刷新
2.上拉加载更多
3.增加header
4.增加footer
5.增加分标题
。。。
提升代码水平,从这里开始!