很多时候 APP 有些页面,会有需要展示多个不同类型的数据都在一个页面,而且数据是服务器动态返回的,顺序也是不确定的。这时候我们就需要在 RecyclerView 的 Adapter 做一些对应的处理。
这时候我们就需要在RecyclerView的Adapter做一些对应的处理。
写了个 Demo 放在了 Github 上:https://github.com/jeffreyxuworld/RecyclerViewAdapter
例子1:利用 getItemViewType,做不同 position 位置的处理。
@Override
public int getItemViewType(int position) {
if (position == 0) {
return SHOW_BANNER_AREA_TYPE;
}else if(position == getItemCount() - 1){
return SHOW_BOTTOM_AREA_TYPE;
} else {
if(novelLibraryBeans != null && novelLibraryBeans.size() > 0){
if(position == getItemCount() - 2){
return SHOW_STYLE_TYPE_4;
}else{
if(recmdsBeans.get(position - 1).style_type == 1){
return SHOW_STYLE_TYPE_1;
}else if(recmdsBeans.get(position - 1).style_type == 2){
return SHOW_STYLE_TYPE_2;
}else if(recmdsBeans.get(position - 1).style_type == 3){
return SHOW_STYLE_TYPE_3;
}
}
}else{
if(recmdsBeans.get(position - 1).style_type == 1){
return SHOW_STYLE_TYPE_1;
}else if(recmdsBeans.get(position - 1).style_type == 2){
return SHOW_STYLE_TYPE_2;
}else if(recmdsBeans.get(position - 1).style_type == 3){
return SHOW_STYLE_TYPE_3;
}
}
}
return SHOW_BANNER_AREA_TYPE;
}
例子2:自定义 GridLayoutManager 的 getSpanSize,实现每行不同个数的布局。
val imageAdapter = BannerAdapter(getData(6))
val gridLayoutManager = GridLayoutManager(this, 2)
gridLayoutManager.spanSizeLookup = object : SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if (imageAdapter.getItemViewType(position) == 2) {
2 //如果是长的图,占2份的位置
} else {
1
}
}
}
currentBinding.rvGrid.layoutManager = gridLayoutManager
currentBinding.rvGrid.adapter = imageAdapter