在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,我们下篇文章见~