RecyclerView的优势还在于他可以自定义itemView,来实现不同的view,实现效果(根据position的不同来展示不同的itemview!):
点击事件的实现: link.
下拉刷新的实现: link.
实现思路:根据postiion的不同设置viewtype的值,来返回不同的itemview
——————————————————————————————————————————
实现步骤:
1、创建Adapter,基本设置
特别注意!!! 自定义的viewholder在创建adapter的时候是不需要泛型了!直接继承RecyclerView.Adapter即可!
Adapter的基本格式: 想要外面传什么参数进来,就设置在构造函数中
对于自定义item的实现我们主要修改onCreateViewHolder方法,因为该方法是用来创建InnerHolder的,所以不同类型的itemView需要在这里根据条件进行设置!这里的条件就是 viewType !可以在该方法中看到这个参数,所以需要去复写getItemViewType方法!即步骤2中的内容
2、复写getItemViewType方法
该方法的作用是返回不同的viewType,常用于自定义的viewHolder中,我们去复写这个方法,以本文demo为例,如果position % 2是0的话,我们就返回参数0;如果position % 2是1的话,我们就返回参数1(viewtype的数据类型是 int )
@Override
public int getItemViewType(int position) {
if (position%2==0){
return 0;
}else{
return 1;
}
}
3、创建不同的itemview,viewHolder
为了返回两种itemview,我们创建两个itemview的布局:
viewHolder 继承 RecyclerView.viewHolder,为了能返回不同的viewholder,我们创建两个viewholder
public class FirstInnerHolder extends RecyclerView.ViewHolder {
public FirstInnerHolder(@NonNull View itemView) {
super(itemView);
}
}
public class SecondInnerHolder extends RecyclerView.ViewHolder {
public SecondInnerHolder(@NonNull View itemView) {
super(itemView);
}
}
此时我们根据viewType的不同值来返回不同的itemview:
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType== 0) {
View view = View.inflate(parent.getContext(), R.layout.item_more_item_view_copy, null);
return new FirstInnerHolder(view);
} else if (viewType == 1) {
View view_second = View.inflate(parent.getContext(), R.layout.item_more_item_view, null);
return new SecondInnerHolder(view_second);
}
return null;
}
实现效果:
源码:
Adapter:
public class MoreItemViewAdapter extends RecyclerView.Adapter {
private static final String TAG = "MoreItemViewAdapter";
private