RecyclerView的极尽升华:BaseRecyclerViewFragment(修改)

之前有写一篇,东西很好,但是掺杂上我自己的东西,显得不太好。所以这里写一个通俗易懂,清新优雅的版本。既可以简化读者在面对大量RecyclerView时的操作,也可以让读者在阅读本文时,有所收获。


先提一个问题,为什么要写一个BaseRecyclerViewFragment?有这个必要吗?

如果你的项目中会出现大量的RecyclerView,我觉得是有必要的,不仅仅是减少你的代码量和增加你的条理,更是方便了之后需求的修改以及维护。


这里我们拿开源中国的app举个例子。

       

他的页面像图1由大量RecyclerView堆砌而成,而右边那张图是他仅仅一个综合模块的所有RecyclerView。也就是说这个app光第一部分就有几十个RecyclerView!如果你不能建造一个BaseRecyclerViewFragment来很好地管理所有的RecyclerView的话,后果可想而知。而事实证明,他们的源代码里确实存在着这样一个base类。


怎么设计这样一个BaseRecyclerViewFragment呢?

很简答,你只需要通过抽象方法,把所有需要的东西都交给子类去实现,在父类中帮他省去多余代码。最重要的是,对于数据的绑定操作、对于控件的设置图片,文字,监听都是通过抽象方法!!!这种便利性可想而知。

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;
    }
}
首先最上面有个泛型<T>,指代你要传入的数据类型。如果是纯文字,String,如果有更多个性化的需求,传JavaBean。

之后就是定义了几个抽象方法

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.增加分标题

。。。


提升代码水平,从这里开始!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值