我试图通过在GitHub上查看这个例子来了解Tinder喜欢/不喜欢卡片系统是如何工作的:https://github.com/kikoso/Swipeable-Cards/blob/master/AndTinder/src/main/java/com/andtinder/view/CardStackAdapter.java。我理解BaseAdapter的重要性,并用必要的信息填充视图/卡片。这部分令我困惑的代码是:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
FrameLayout wrapper = (FrameLayout) convertView;
FrameLayout innerWrapper;
View cardView;
View convertedCardView;
if (wrapper == null) {
wrapper = new FrameLayout(mContext);
wrapper.setBackgroundResource(R.drawable.card_bg);
if (shouldFillCardBackground()) {
innerWrapper = new FrameLayout(mContext);
innerWrapper.setBackgroundColor(mContext.getResources().getColor(R.color.card_bg));
wrapper.addView(innerWrapper);
} else {
innerWrapper = wrapper;
}
cardView = getCardView(position, getCardModel(position), null, parent);
innerWrapper.addView(cardView);
} else {
if (shouldFillCardBackground()) {
innerWrapper = (FrameLayout) wrapper.getChildAt(0);
} else {
innerWrapper = wrapper;
}
cardView = innerWrapper.getChildAt(0);
convertedCardView = getCardView(position, getCardModel(position), cardView, parent);
if (convertedCardView != cardView) {
wrapper.removeView(cardView);
wrapper.addView(convertedCardView);
}
}
return wrapper;
}
为什么动态创建FrameLayouts?似乎多个FrameLayouts正在使用包装器和内包装器制作?包装甚至意味着什么?为什么类似于shouldFillCardBackground()的类被使用但在存储库中的任何地方都没有定义?
答案 0 :(得分:0)
首先,重要的是要注意到您链接的CardStackAdapter
是抽象的,因此它永远不会直接实例化。相反,将使用类SimpleCardStackAdapter
。
那说,让我们明白方法的目的; getView()
方法的目的是为给定位置创建和填充视图。
创建布局可以通过从xml中扩展它们来完成,或者通过在代码中创建布局来完成。后者发生在这里。他们动态创建布局的主要原因是保持动态。布局中的确切视图取决于在运行时检查的一些配置(在方法shouldFillCardBackground()
中)。请注意,这也可以通过在xml中创建布局,然后对其进行充气,并动态隐藏/显示(或删除/添加)视图和布局来实现。代码的作者只是选择在代码中执行它。
包装器是一个对象(在这种情况下是一个布局),它不会占用其他对象(其他布局)。在布局的上下文中,它们通常用于添加某种背景或填充。这也是这里发生的事情。
shouldFillCardBackground()
是一个方法,而不是一个类,它是明确定义的:在第71行。
重要的是要意识到这个代码的主要目的似乎是一个例子,一个演示。它可能没有完全正常运行,并且并非所有内容都以最佳方式实现(例如,shouldFillCardBackground()
默认返回true。)