RecyclerView的嵌套使用

3,945 阅读2分钟

在Android开发中,RecyclerView应该是最常用,而且是非常强大的一个控件,可以毫不夸张地说,任何界面都可以通过RecyclerView去实现。RecyclerView最常用的就是竖向的方式,通过手指可以上下滑动,比如微信的首页就是一个典型的recyclerview。其实还有一种用法也很常见,就是竖向的recyclerview里嵌套一个横向的Recyclerview,比如今日头条APP的新闻浏览页面里经常会有个横向的recyclerview,放一些短视频,今天我们来实现一下这个效果。

我们先看一下效果图:

其实这是一个典型的RecyclerView嵌套的例子,外层是一个竖向recyclerview,第一行里面是一个横向recyclerview,我们看一下它的简单实现

public class VerticalRecyclerAdapter extends RecyclerView.Adapter {
    public static final int TYPE1 = 1;
    public static final int TYPE2 = 2;
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        if (viewType == TYPE2) {
            return new TextViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.text_holder, viewGroup, false));
        } else {
            return new HorizontalViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.horizontal_layout, viewGroup, false));
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
        if (position != 0) {
            TextViewHolder textViewHolder = (TextViewHolder) viewHolder;
            textViewHolder.textView.setText("item" + position);
        }
    }

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

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return TYPE1;
        } else {
            return TYPE2;
        }
    }

    public static class TextViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;

        public TextViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text);
        }
    }

    public static class HorizontalViewHolder extends RecyclerView.ViewHolder {
        private RecyclerView recyclerView;

        public HorizontalViewHolder(@NonNull View itemView) {
            super(itemView);
            recyclerView = itemView.findViewById(R.id.hori_recyclerview);
            recyclerView.setLayoutManager(new LinearLayoutManager(itemView.getContext(),LinearLayoutManager.HORIZONTAL, false));
            recyclerView.setAdapter(new HorizontalAdapter());
        }
    }
}

我们都知道,recyclerview有四个最重要的方法,分别是getItemCount,getItemViewType,onCreateViewHolder以及onBindViewHolder,只要真正理解了这四个方法,recyclerview的常规使用就没有任何问题了。

我们看一下我们实现的时候,getItemCount里面返回了20,代表竖向的包含20个item,在getItemViewType方法里,我们让postion为0的item返回TYPE1,其余item返回TYPE2,相当于这个竖向recyclerview包含两种item类型,具体的类型对应得viewholder在onCreateViewHolder方法里体现,当TYPE为1的时候,对应包含横向Recyclerview的viewholder,而TYPE为2时,对应的时一个只包含Textview的viewholder,两种viewholder的具体实现也在代码里体现。我们看一下包含横向recyclerview的adapter

public class HorizontalAdapter extends RecyclerView.Adapter {
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        return new TextHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.hori_item_layout, viewGroup, false));
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
        TextHolder holder = (TextHolder) viewHolder;
        holder.textView.setText("item" + position);
    }

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

    public static class TextHolder extends RecyclerView.ViewHolder {
        private TextView textView;

        public TextHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.text);
        }
    }
}

分析过程跟上面一样,也是有20个item,每个item对应的是只包含一个textview的viewholder,这样就实现了两个recyclerview的嵌套,哈哈,是不是so easy?

上面这个场景是recyclerview嵌套一个非常典型的例子,recyclerview还有很多有趣的用法,我们后续文章再进行介绍,总之还是那句话,如果你把recyclerview用的非常熟悉了,其实很多页面的实现也会变得so easy,我们下篇文章见~