为什么动态创建framelayout?

时间:2014-11-20 08:24:05

标签: android

我试图通过在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()的类被使用但在存储库中的任何地方都没有定义?

1 个答案:

答案 0 :(得分:0)

首先,重要的是要注意到您链接的CardStackAdapter是抽象的,因此它永远不会直接实例化。相反,将使用类SimpleCardStackAdapter

那说,让我们明白方法的目的; getView()方法的目的是为给定位置创建和填充视图。

创建布局可以通过从xml中扩展它们来完成,或者通过在代码中创建布局来完成。后者发生在这里。他们动态创建布局的主要原因是保持动态。布局中的确切视图取决于在运行时检查的一些配置(在方法shouldFillCardBackground()中)。请注意,这也可以通过在xml中创建布局,然后对其进行充气,并动态隐藏/显示(或删除/添加)视图和布局来实现。代码的作者只是选择在代码中执行它。

包装器是一个对象(在这种情况下是一个布局),它不会占用其他对象(其他布局)。在布局的上下文中,它们通常用于添加某种背景或填充。这也是这里发生的事情。

shouldFillCardBackground()是一个方法,而不是一个类,它是明确定义的:在第71行。

重要的是要意识到这个代码的主要目的似乎是一个例子,一个演示。它可能没有完全正常运行,并且并非所有内容都以最佳方式实现(例如,shouldFillCardBackground()默认返回true。)