当前,许多app除了良好的用户体验之外,更重要的是需要丰富的内容,以及更强的用户黏性。作为工具app中的日活量居高的应用,就更应该具有更好的用户体验以及内容提供,而首页就首当其冲。 根据以上的描述,我们需要拥有良好的运营能力来承载日常的运营。首页拥有快速迭代能力无疑是一个重要的环节,所以这就出现了首页卡片。
为了使首页的运营能力更强,程序员的接入更加简易。所以首页卡片采用了XXXX设计模式。卡片框架实现了BaseCardAdapter, BaseCard, BaseCardItemViewHolder。使用者只需要在自己的Adapter继承BaseCardAdapter,实现自己业务相关信息就行。
####BaseCard类:
...
// 获取当前指向的item的type
public int getCurrentItemType(int offset) {
if (offset == 0) {
return getHeaderType();
} else {
return getItemType();
}
}
public boolean isTypeHere(int type) {
if (type == getHeaderType() || type == getItemType()) {
return true;
}
return false;
}
public BaseCardItemViewHolder getViewHolderByType(ViewGroup parent, int type) {
if (type == getHeaderType()) {
return getHeaderViewHolder(parent);
} else if (type == getItemType()) {
return getItemViewHolder(parent);
}
return null;
}
...
重点在于getViewHolderByType来区分不同卡片,从而获得不同的卡片显示效果。 ####BaseCardAdapter
...
public BaseCardItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
for (BaseCard card : mCards) {
if (card.isTypeHere(viewType)) {
return card.getViewHolderByType(parent, viewType);
}
}
return null;
}
...
@Override
public void onBindViewHolder(BaseCardItemViewHolder holder, int position) {
holder.bindItem(this, mCardItem, position);
}
@Override
public int getItemViewType(int position) {
if(mCards != null || mCards.size() > 0) {
int[] cardPositionOffset = getCardPositionOffset(position);
BaseCard card = mCards.get(cardPositionOffset[0]);
if (cardPositionOffset[1] != 0) {
mCardItem = card.getCardData().get(cardPositionOffset[1] - 1);
}
return card.getCurrentItemType(cardPositionOffset[1]);
} else {
return 0;
}
}
/**
* 获取当前item所在卡片位置
* @param position
* @return item所在卡片位置
*/
private int[] getCardPositionOffset(int position) {
...
cardPositionOffset[0] = cardPosition;
cardPositionOffset[1] = cardOffSet;
return cardPositionOffset;
}
从BaseCardAdapter中可以看出,子类只需要继承它并在子类中实现数据加载,并且new不同的Card出来(如2.1中的card1,card2),并调用addCard方法即可将方法添加至adapter中。