前段时间,在闲下来的时候做自己的项目,碰到了一个深坑,其实也不能说是坑吧,主要是这个需求比较奇怪,需求是这样的,它是一个商城的主界面实现,由于有相同的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