Android切换RecyclerView的Item布局(Expandable RecyclerView?)

让一个RecyclerView中的一个Item有两种不同的布局,可以用来给Item赋予多个状态,当然也可以实现类似Expandable RecyclerView的效果。

诀窍在于notifyItemChanged的时候,如果getItemViewType返回了不同的值,onCreateViewHolder就会被再次调用,这时新建一个新的ViewHolder就可以啦。

用实现一个Expandable RecyclerView来举例子:

  1. 首先要使用不同的ViewType:

    1
    2
    3
    4
    @Override
    public int getItemViewType() {
    return isExpanded() ? ExpandedAlarmViewHolder.VIEW_TYPE : CollapsedAlarmViewHolder.VIEW_TYPE;
    }
  2. 要让第一种ViewHolder变成第二种,要在点击了第一种ViewHolder中的一个Button或其他,触发展开事件:

    1
    2
    3
    4
    5
    6
    public void expand() {
    if (!isExpanded()) {
    mExpanded = true;
    notifyItemChanged();
    }
    }
  3. onCreateViewHolder中根据不同的ViewType创建不同的ViewHolder

    1
    2
    3
    4
    5
    6
    7
    8
    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    final ItemViewHolder.Factory factory = mFactoriesByViewType.get(viewType);
    if (factory != null) {
    return factory.createViewHolder(parent, viewType);
    }
    throw new IllegalArgumentException("Unsupported view type: " + viewType);
    }

    这里也可以不用factory,直接判断viewType

  4. TaDa,完成。其实这篇文章最重要的就是第二句话。

来源:AOSP的DeskClock