RecycleView在中间“插入”布局以及添加头部的姿势

本文介绍如何在 RecyclerView 中实现中间插入不同布局以及添加头部布局的需求。通过分析错误实现的问题,强调了正确的处理方式,包括修改 getItemCount 方法的返回值、调整 onBindViewHolder 和 onCreateViewHolder 方法,以及添加获取真实位置的方法。提供了完整的示例代码供参考。
摘要由CSDN通过智能技术生成

前段时间,在闲下来的时候做自己的项目,碰到了一个深坑,其实也不能说是坑吧,主要是这个需求比较奇怪,需求是这样的,它是一个商城的主界面实现,由于有相同的item,但是它除了有相同的Item外,还有一些不同的布局,所以我在ListView和RecyclerView当中做出选择的时候,毫不犹豫的选择了RecyclerView。至于为什么要用RecyclerView呢?因为RecyclerView好玩一点,然后就掉到坑里面了,差点没爬出来。注意,为了简单,我这里插入的地方都是固定的数字!!

我们先看一下整体的效果图:温馨提醒,截的是长图。谨慎观看。另外UI有点丑,主要是还没找人设计,别吐槽UI。

分析一下实现方式: 上面的整体作为一个头部HeaderView,中间的火爆热销作为中间的一个Item,商家推荐作为中间另外一个Item。这样就更决定了我使用RecyclerView的决心。有了思路就开始开干,由于盲目的开干,我也看了很多关于RecyclerView实现多种布局的博客,但是却偏偏没有发现有哪一篇是关于在RecyclerView中间“插入”不同布局的博客。至于这里为什么我将“插入”着重标明,先买个雷。

下面来看一下,我在使用过程中遇到了什么问题!一般情况下,我们使用RecyclerView多布局的时候,都需要额外多重写一个方法:getItemViewType(int position)

    public int getItemViewType(int position) {
        if(position == 0){
            return TYPE_HEADER;
        }
        //这里我为了方便实现,在这里写了一个固定的数字
        if(position == 5) {
            return TYPE_MIDDLE_VIEW;
        }
        return TYPE_NORMAL;
    }

这个方法接收了一个position, position表示的是当前位置是第几个Item,然后我们通过position可以拿到当前的视图对象,然后判断这个Item视图对象需要哪一种视图,然后返回一个与该视图与之相匹配的视图标志。

在我们必须重写的三个方法中,细心的小伙伴们肯定发现了,有一个方法是带有viewType参数的:OnCreateViewHolder(ViewGroup parent, int viewType)

 @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if(viewType == TYPE_HEADER){
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item01, null, false);
        return new MyHeadHolder(view);
    }
    return null;
}

肯定也有小伙伴猜到了,这里的viewType和上面返回值肯定有这千丝万缕的关系。没错,这里的ViewType就是上面方法的返回值,getItemViewType(int position)这个方法只是决定了position这个位置应该创建什么视图,而真正创建视图的就是OnCreateViewHolder(ViewGroup parent, int viewType)这个方法。即一个是视图的决策者,一个是视图的执行者。

上面两个方法的实现就是实现多布局的重中之重。其他的几个方法就没什么可说的了,一个是返回数据的总条数。

 @Override
public int getItemCount() {
    return 0;
}

一个是给每一个position对应的视图绑定数据源

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

}

遇到坑的Adapter:(Activity的代码我就不贴了,贼简单)

public class MyAdapter2 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int TYPE_NORMAL = 0;
    private static final int TYPE_HEADER = 1;
    private static final int TYPE_MIDDLE_VIEW = 2;
    private ArrayList<String> mList;
    public MyAdapter2(ArrayList<String> list){
        this.mList = list;
    }


    @Override
    public int getItemViewType(int position) {
        if(position 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值