@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; }
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(); } } };
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; }
/** * 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; }
/** * 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; }
@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; }
/** * 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(); } } }
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; } }
@Override public int getItemViewType(int position) { return mAdapter.getItemViewType(position); }
@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; }
@Override public int getItemViewType(int position) { return isSectionHeaderPosition(position) ? getViewTypeCount() - 1 : mBaseAdapter.getItemViewType(position); }
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; }