recyleview剖解

一、a.RecyclerView.Adapter关键继承函数
getItemViewType获取本item的View类型
getItemCount()获取item的个数
onCreateViewHolder创建ViewHolder,目的传入View

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View inflate = null;
    switch (viewType) {
        case DataModel.TYPE_ONE:
            inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_one, parent, false);
            return new OneHolder(inflate);
        case DataModel.TYPE_TWO:
            inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_two, parent, false);
            return new TwoHolder(inflate);
        case DataModel.TYPE_THREE:
            inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_three, parent, false);
            return new ThreeHolder(inflate);
    }
    return null;
}

onBindViewHolder获取对应position数据Model,用来绑定View与数据Model

  @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int viewType = getItemViewType(position);
        int realPosition = position - mPositions.get(viewType);
        Log.d("zm","realPosition:"+realPosition);
        switch (viewType){
            case TYPE_ONE:
                ((OneHolder)holder).onBindViewHolder(dataModels1.get(realPosition));
                break;
            case TYPE_TWO:
                ((TwoHolder)holder).onBindViewHolder(dataModels2.get(realPosition));
                break;
            case TYPE_THREE:
                ((ThreeHolder)holder).onBindViewHolder(dataModels3.get(realPosition));
                break;

        }
    }

b.RecyclerView.ViewHolder 用来绑定View与数据Model

onBindViewHolder(T model);

 

c.RecyclerView.setLayoutManager 设置布局管理

RecyclerView 控件通过 setLayoutManager() 方法来设置布局管理器,这是使用 RecyclerView 必须的操作步骤。这个布局管理器分三种 LinearLayoutManagerGridLayoutManagerStaggeredGridLayoutManager

spanCount:在创建 GridLayoutManager 对象的时候构造方法需要传入这个参数,也就是设置每行排列 item 个数。

spanSize:在 setSpanSizeLookup() 方法中,这个方法返回的是当前位置的 item 跨度大小。

 setSpanSizeLookup() 方法,我们主要使用这个方法来展示不同的 item 屏幕跨度。

 final GridLayoutManager gl = new GridLayoutManager(getApplicationContext(), 2);
//        id_recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.VERTICAL,false));
        gl.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                if(id_recyclerView.getAdapter().getItemViewType(position)==DataModel.TYPE_TWO){
                    return gl.getSpanCount();//如果是两行模式,每行2个item
                }else{
                    return 1;//其他每行1个
                }

            }
        });
        id_recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
            @Override
            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
                GridLayoutManager.LayoutParams lp = (GridLayoutManager.LayoutParams) view.getLayoutParams();
                int spanSize = lp.getSpanSize();
                int spanIndex = lp.getSpanIndex();
                outRect.top = 20;
                if(spanSize!=gl.getSpanCount()){
                    if(spanIndex == 1){
                        outRect.left = 10;
                    }else{
                        outRect.right = 10;
                    }
                }
            }
        });

        id_recyclerView.setLayoutManager(gl);

 d.RecyclerView.addItemDecoration 装饰item

首先我们假设绿色区域代表的是我们的内容,红色区域代表我们自己绘制的装饰,可以看到:

图1:代表了getItemOffsets(),可以实现类似padding的效果

图2:代表了onDraw(),可以实现类似绘制背景的效果,内容在上面

图3:代表了onDrawOver(),可以绘制在内容的上面,覆盖内容

具体请看https://www.jianshu.com/p/b46a4ff7c10a里面有详细解说这个怎样用。

 

二、BaseQuickAdapter第三方辅助Adapter
其他关键函数
notifyItemInserted
registerAdapterDataObserver
onViewAttachedToWindow
onViewDetachedFromWindow

BaseQuickAdapter构造单一模式

MultipleItemRvAdapter可以构造多个结构模式

MultipleItemRvAdapter extends BaseQuickAdapter extends  RecyclerView.Adapter整个构造靠Provider
onCreateViewHolder  ->onCreateDefViewHolder->Provider.getLayoutId()获取资源id来创建Holder

onBindViewHolder ->Provider.conver(holder,getItem(position))把holder和对应的数据传递到对应

public class TestHomeAdapter extends MultipleItemRvAdapter<TestBean, BaseViewHolder> {
    //通栏商品大图片
    public static final int TYPE_IMG = 100;
    //通栏图文
    public static final int TYPE_TEXT_AND_IMG = 200;
    //通栏文本
    public static final int TYPE_TEXT = 300;
    //三列
    public static final int TYPE_THREE_COLUMN = 400;
    //通栏水平拖动
    public static final int TYPE_HORIZONTAL_SCROLL = 500;
    //通栏窄图片
    public static final int TYPE_NARROW_IMG = 600;
    //两列
    public static final int TYPE_TWO_COLUMN = 700;
    public TestHomeAdapter() {
        super(null);
        finishInitialize();

    }

    @Override
    protected int getViewType(TestBean testBean) {
        int type = testBean.getType();
        if (type == 1) {
            return TYPE_IMG;
        } else if (type == 2) {
            return TYPE_TEXT_AND_IMG;
        } else if (type == 3) {
            return TYPE_TEXT;
        } else if (type == 4) {
            return TYPE_THREE_COLUMN;
        } else if (type == 5) {
            return TYPE_HORIZONTAL_SCROLL;
        } else if (type == 6) {
            return TYPE_NARROW_IMG;
        } else if (type == 7) {
            return TYPE_TWO_COLUMN;
        }
        return 0;
    }

    @Override
    public void registerItemProvider() {
        //通栏商品大图片
        mProviderDelegate.registerProvider(new ImgItemProvider());
        //通栏图文
        mProviderDelegate.registerProvider(new ImgAndTextItemProvider());
        //通栏文本
        mProviderDelegate.registerProvider(new TextItemProvider());
        //三列图文
        mProviderDelegate.registerProvider(new ThreeColumnItemProvider());
        //通栏横向滑动
        mProviderDelegate.registerProvider(new ScrollItemProvider());
        //通栏窄图片
        mProviderDelegate.registerProvider(new NarrowImgItemProvider());
        //两列图文
        mProviderDelegate.registerProvider(new TwoColumnItemProvider());
    }

    @Override
    public void setOnLoadMoreListener(RequestLoadMoreListener requestLoadMoreListener, RecyclerView recyclerView) {
        super.setOnLoadMoreListener(requestLoadMoreListener, recyclerView);
    }
}
public class ThreeColumnItemProvider extends BaseItemProvider<TestBean, BaseViewHolder> {
    @Override
    public int viewType() {
        return TestHomeAdapter.TYPE_THREE_COLUMN;
    }

    @Override
    public int layout() {
        return R.layout.app_item_home_three_column;
    }

    @Override
    public void convert(BaseViewHolder helper, TestBean data, int position) {
        helper.setText(R.id.item_tv, data.getGoodsName() + "");
        Glide.with(mContext)
                .load(data.getGoodsUrl())
                .dontAnimate()
                .into((AppCompatImageView) helper.getView(R.id.item_img));


    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

turbocc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值