Ejemplo n.º 1
0
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
   SwipeMenuLayout layout = null;
   if (convertView == null) {
     View contentView = mAdapter.getView(position, convertView, parent);
     SwipeMenu menu = new SwipeMenu(mContext);
     menu.setViewType(mAdapter.getItemViewType(position));
     createMenu(menu);
     SwipeMenuView menuView = new SwipeMenuView(menu, (SwipeMenuListView) parent);
     menuView.setOnSwipeItemClickListener(this);
     SwipeMenuListView listView = (SwipeMenuListView) parent;
     layout =
         new SwipeMenuLayout(
             contentView,
             menuView,
             listView.getCloseInterpolator(),
             listView.getOpenInterpolator());
     layout.setPosition(position);
   } else {
     layout = (SwipeMenuLayout) convertView;
     layout.closeMenu();
     layout.setPosition(position);
     View view = mAdapter.getView(position, layout.getContentView(), parent);
   }
   return layout;
 }
Ejemplo n.º 2
0
  private View viewForPage(int page) {

    // if the requested page is outside of the adapters scope, return null.
    // This should only happen when over flipping with mode RUBBER_BAND
    if (page < 0 || page >= mPageCount) {
      return null;
    }

    final int viewType = mAdapter.getItemViewType(page);

    // check if view needed is in active views, if so order to front and
    // return this view
    View v = getActiveView(page);
    if (v != null) {
      return v;
    }

    // get(and remove) a convertview with correct viewtype from recycled
    // views
    v = mRecycler.getScrapView(page, viewType);

    // pass that view (can be null) into adapter to fill the view
    v = mAdapter.getView(page, v, this);

    // insert that view into active views pushing the least used active view
    // into recycled views
    addToActiveView(v, page, viewType);

    // measure and layout view
    measureAndLayoutChild(v);

    // return view
    return v;
  }
        @Override
        public void onScroll(
            AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

          if (mDelegateOnScrollListener != null) { // delegate
            mDelegateOnScrollListener.onScroll(
                view, firstVisibleItem, visibleItemCount, totalItemCount);
          }

          // get expected adapter or fail fast
          ListAdapter adapter = getAdapter();
          if (adapter == null || visibleItemCount == 0) return; // nothing to do

          final boolean isFirstVisibleItemSection =
              isItemViewTypePinned(adapter, adapter.getItemViewType(firstVisibleItem));

          if (isFirstVisibleItemSection) {
            View sectionView = getChildAt(0);
            if (sectionView.getTop()
                == getPaddingTop()) { // view sticks to the top, no need for pinned shadow
              destroyPinnedShadow();
            } else { // section doesn't stick to the top, make sure we have a pinned shadow
              ensureShadowForPosition(firstVisibleItem, firstVisibleItem, visibleItemCount);
            }

          } else { // section is not at the first visible position
            int sectionPosition = findCurrentSectionPosition(firstVisibleItem);
            if (sectionPosition > -1) { // we have section position
              ensureShadowForPosition(sectionPosition, firstVisibleItem, visibleItemCount);
            } else { // there is no section for the first visible item, destroy shadow
              destroyPinnedShadow();
            }
          }
        };
Ejemplo n.º 4
0
  private int measureContentWidth() {
    // Menus don't tend to be long, so this is more sane than it looks.
    int maxWidth = 0;
    View itemView = null;
    int itemType = 0;

    final ListAdapter adapter = mAdapter;
    final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    final int count = adapter.getCount();
    for (int i = 0; i < count; i++) {
      final int positionType = adapter.getItemViewType(i);
      if (positionType != itemType) {
        itemType = positionType;
        itemView = null;
      }

      if (mMeasureParent == null) {
        mMeasureParent = new FrameLayout(mContext);
      }

      itemView = adapter.getView(i, itemView, mMeasureParent);
      itemView.measure(widthMeasureSpec, heightMeasureSpec);

      final int itemWidth = itemView.getMeasuredWidth();
      if (itemWidth >= mPopupMaxWidth) {
        return mPopupMaxWidth;
      } else if (itemWidth > maxWidth) {
        maxWidth = itemWidth;
      }
    }

    return maxWidth;
  }
    @Override
    public int getItemViewType(int position) {

      final int numHeadersAndPlaceholders = getHeadersCount() * mNumColumns;
      final int adapterViewTypeStart = mAdapter == null ? 0 : mAdapter.getViewTypeCount() - 1;
      int type = AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
      if (mCachePlaceHoldView) {
        // Header
        if (position < numHeadersAndPlaceholders) {
          if (position == 0) {
            if (mCacheFirstHeaderView) {
              type =
                  adapterViewTypeStart + mHeaderViewInfos.size() + mFooterViewInfos.size() + 1 + 1;
            }
          }
          if (position % mNumColumns != 0) {
            type = adapterViewTypeStart + (position / mNumColumns + 1);
          }
        }
      }

      // Adapter
      final int adjPosition = position - numHeadersAndPlaceholders;
      int adapterCount = 0;
      if (mAdapter != null) {
        adapterCount = getAdapterAndPlaceHolderCount();
        if (adjPosition >= 0 && adjPosition < adapterCount) {
          if (adjPosition < mAdapter.getCount()) {
            type = mAdapter.getItemViewType(adjPosition);
          } else {
            if (mCachePlaceHoldView) {
              type = adapterViewTypeStart + mHeaderViewInfos.size() + 1;
            }
          }
        }
      }

      if (mCachePlaceHoldView) {
        // Footer
        final int footerPosition = adjPosition - adapterCount;
        if (footerPosition >= 0
            && footerPosition < getCount()
            && (footerPosition % mNumColumns) != 0) {
          type =
              adapterViewTypeStart
                  + mHeaderViewInfos.size()
                  + 1
                  + (footerPosition / mNumColumns + 1);
        }
      }
      if (DEBUG) {
        Log.d(
            LOG_TAG,
            String.format(
                "getItemViewType: pos: %s, result: %s",
                position, type, mCachePlaceHoldView, mCacheFirstHeaderView));
      }
      return type;
    }
 int findPreviousVisibleSectionPosition(int fromPosition) {
   ListAdapter adapter = getAdapter();
   for (int childIndex = fromPosition - 1; childIndex >= 0; childIndex--) {
     int viewType = adapter.getItemViewType(childIndex);
     if (isItemViewTypePinned(adapter, viewType)) return childIndex;
   }
   return -1;
 }
Ejemplo n.º 7
0
  /**
   * Returns a recycled view from the cache that can be reused, or null if one is not available.
   *
   * @param adapterIndex
   * @return
   */
  private View getRecycledView(int adapterIndex) {
    int itemViewType = mAdapter.getItemViewType(adapterIndex);

    if (isItemViewTypeValid(itemViewType)) {
      return mRemovedViewsCache.get(itemViewType).poll();
    }

    return null;
  }
 int findFirstVisibleSectionPosition(int firstVisibleItem, int visibleItemCount) {
   ListAdapter adapter = getAdapter();
   for (int childIndex = 0; childIndex < visibleItemCount; childIndex++) {
     int position = firstVisibleItem + childIndex;
     int viewType = adapter.getItemViewType(position);
     if (isItemViewTypePinned(adapter, viewType)) return position;
   }
   return -1;
 }
Ejemplo n.º 9
0
 /**
  * Adds the provided view to a recycled views cache.
  *
  * @param adapterIndex
  * @param view
  */
 private void recycleView(int adapterIndex, View view) {
   // There is one Queue of views for each different type of view.
   // Just add the view to the pile of other views of the same type.
   // The order they are added and removed does not matter.
   int itemViewType = mAdapter.getItemViewType(adapterIndex);
   if (isItemViewTypeValid(itemViewType)) {
     mRemovedViewsCache.get(itemViewType).offer(view);
   }
 }
  int findCurrentSectionPosition(int fromPosition) {
    ListAdapter adapter = getAdapter();

    if (adapter instanceof SectionIndexer) {
      // try fast way by asking section indexer
      SectionIndexer indexer = (SectionIndexer) adapter;
      int sectionPosition = indexer.getSectionForPosition(fromPosition);
      int itemPosition = indexer.getPositionForSection(sectionPosition);
      int typeView = adapter.getItemViewType(itemPosition);
      if (isItemViewTypePinned(adapter, typeView)) {
        return itemPosition;
      } // else, no luck
    }

    // try slow way by looking through to the next section item above
    for (int position = fromPosition; position >= 0; position--) {
      int viewType = adapter.getItemViewType(position);
      if (isItemViewTypePinned(adapter, viewType)) return position;
    }
    return -1; // no candidate found
  }
  public int getItemViewType(int position) {
    int numHeaders = getHeadersCount();
    if (mAdapter != null && position >= numHeaders) {
      int adjPosition = position - numHeaders;
      int adapterCount = mAdapter.getCount();
      if (adjPosition < adapterCount) {
        return mAdapter.getItemViewType(adjPosition);
      }
    }

    return AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
  }
Ejemplo n.º 12
0
 @Override
 public int getItemViewType(int position) {
   int numHeadersAndPlaceholders = getHeadersCount() * mNumColumns;
   if (position < numHeadersAndPlaceholders && (position % mNumColumns != 0)) {
     // Placeholders get the last view type number
     return mAdapter != null ? mAdapter.getViewTypeCount() : 1;
   }
   if (mAdapter != null && position >= numHeadersAndPlaceholders) {
     int adjPosition = position - numHeadersAndPlaceholders;
     int adapterCount = mAdapter.getCount();
     if (adjPosition < adapterCount) {
       return mAdapter.getItemViewType(adjPosition);
     }
   }
   return AdapterView.ITEM_VIEW_TYPE_HEADER_OR_FOOTER;
 }
Ejemplo n.º 13
0
  /**
   * Get the type of View that will be created by getView() for the specified item.
   *
   * @param position Position of the item whose data we want
   */
  @Override
  public int getItemViewType(int position) {
    int typeOffset = 0;
    int result = -1;

    for (ListAdapter piece : pieces) {
      int size = piece.getCount();

      if (position < size) {
        result = typeOffset + piece.getItemViewType(position);
        break;
      }

      position -= size;
      typeOffset += piece.getViewTypeCount();
    }

    return (result);
  }
  int findFirstVisibleSectionPosition(int firstVisibleItem, int visibleItemCount) {
    ListAdapter adapter = getAdapter();

    int adapterDataCount = adapter.getCount();
    if (getLastVisiblePosition() >= adapterDataCount)
      return -1; // dataset has changed, no candidate

    if (firstVisibleItem + visibleItemCount
        >= adapterDataCount) { // added to prevent index Outofbound (in case)
      visibleItemCount = adapterDataCount - firstVisibleItem;
    }

    for (int childIndex = 0; childIndex < visibleItemCount; childIndex++) {
      int position = firstVisibleItem + childIndex;
      int viewType = adapter.getItemViewType(position);
      if (isItemViewTypePinned(adapter, viewType)) return position;
    }
    return -1;
  }
  private int getItemHeight(int position) {

    final int first = getFirstVisiblePosition();
    final int last = getLastVisiblePosition();

    if (position >= first && position <= last) {
      return getChildAt(position - first).getHeight();
    } else {
      // Log.d("mobeta", "getView for height");

      final ListAdapter adapter = getAdapter();
      int type = adapter.getItemViewType(position);

      // There might be a better place for checking for the following
      final int typeCount = adapter.getViewTypeCount();
      if (typeCount != mSampleViewTypes.length) {
        mSampleViewTypes = new View[typeCount];
      }

      View v;
      if (type >= 0) {
        if (mSampleViewTypes[type] == null) {
          v = adapter.getView(position, null, this);
          mSampleViewTypes[type] = v;
        } else {
          v = adapter.getView(position, mSampleViewTypes[type], this);
        }
      } else {
        // type is HEADER_OR_FOOTER or IGNORE
        v = adapter.getView(position, null, this);
      }

      ViewGroup.LayoutParams lp = v.getLayoutParams();
      final int height = lp == null ? 0 : lp.height;
      if (height > 0) {
        return height;
      } else {
        int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
        v.measure(spec, spec);
        return v.getMeasuredHeight();
      }
    }
  }
Ejemplo n.º 16
0
  private void ensureFull() {
    while (mNextAdapterPosition < mListAdapter.getCount() && getChildCount() < mMaxVisible) {
      View view = mListAdapter.getView(mNextAdapterPosition, null, this);
      view.setLayerType(LAYER_TYPE_SOFTWARE, null);
      if (mOrientation == Orientation.Disordered) {
        view.setRotation(getDisorderedRotation());
      }
      addViewInLayout(
          view,
          0,
          new LayoutParams(
              LayoutParams.WRAP_CONTENT,
              LayoutParams.WRAP_CONTENT,
              mListAdapter.getItemViewType(mNextAdapterPosition)),
          false);

      requestLayout();

      mNextAdapterPosition += 1;
    }
  }
Ejemplo n.º 17
0
 @Override
 public int getItemViewType(int position) {
   return mAdapter.getItemViewType(position);
 }
Ejemplo n.º 18
0
 @Override
 public int getItemViewType(final int position) {
   return wrapped.getItemViewType(position);
 }
  private int getViewTypeFromAdapter(int index) {
    if (mAdapter == null) return 0;

    int type = index < mAdapter.getCount() ? mAdapter.getItemViewType(index) : 0;
    return type;
  }
Ejemplo n.º 20
0
 @Override
 public int getItemViewType(int position) {
   return isSectionHeaderPosition(position)
       ? getViewTypeCount() - 1
       : mBaseAdapter.getItemViewType(position);
 }
Ejemplo n.º 21
0
 private void fillPageForIndex(Page p, int i) {
   p.position = i;
   p.viewType = mAdapter.getItemViewType(p.position);
   p.v = getView(p.position, p.viewType);
   p.valid = true;
 }