code: public void addFooterView(View v, Object data, boolean isSelectable) {
          ListAdapter adapter = getAdapter();
  
          if (adapter != null && !(adapter instanceof HeaderFooterViewGridAdapter)) {
              throw new IllegalStateException(
                      "Cannot add footer view to grid -- setAdapter has already been called.");
          }
  
          FixedViewInfo info = new FixedViewInfo();
          FrameLayout fl = new FullWidthFixedViewLayout(getContext());
          fl.addView(v);
          info.view = v;
          info.viewContainer = fl;
          info.data = data;
          info.isSelectable = isSelectable;
          mFooterViewInfos.add(info);
  
          // in the case of re-adding a header view, or adding one later on,
          // we need to notify the observer
          if (adapter != null) {
              ((HeaderFooterViewGridAdapter) adapter).notifyDataSetChanged();
          }
      }
docs: Add a fixed view to appear at the bottom of the grid. If addFooterView is
  called more than once, the views will appear in the order they were
  added. Views added using this call can take focus if they want.
  <p>
  NOTE: Call this before calling setAdapter. This is so HeaderFooterGridView can wrap
  the supplied cursor with one that will also account for header views.
  
  @param v            The view to add.
  @param data         Data to associate with this view
  @param isSelectable whether the item is selectable