package com.marshalchen.common.uimodule.flipViews.flipview; import android.annotation.TargetApi; import android.os.Build; import android.util.SparseArray; import android.view.View; public class Recycler { static class Scrap { View v; boolean valid; public Scrap(View scrap, boolean valid) { this.v = scrap; this.valid = valid; } } /** Unsorted views that can be used by the adapter as a convert view. */ private SparseArray<Scrap>[] scraps; private SparseArray<Scrap> currentScraps; private int viewTypeCount; void setViewTypeCount(int viewTypeCount) { if (viewTypeCount < 1) { throw new IllegalArgumentException("Can't have a viewTypeCount < 1"); } // do nothing if the view type count has not changed. if (currentScraps != null && viewTypeCount == scraps.length) { return; } // noinspection unchecked @SuppressWarnings("unchecked") SparseArray<Scrap>[] scrapViews = new SparseArray[viewTypeCount]; for (int i = 0; i < viewTypeCount; i++) { scrapViews[i] = new SparseArray<Scrap>(); } this.viewTypeCount = viewTypeCount; currentScraps = scrapViews[0]; this.scraps = scrapViews; } /** @return A view from the ScrapViews collection. These are unordered. */ Scrap getScrapView(int position, int viewType) { if (viewTypeCount == 1) { return retrieveFromScrap(currentScraps, position); } else if (viewType >= 0 && viewType < scraps.length) { return retrieveFromScrap(scraps[viewType], position); } return null; } /** * Put a view into the ScrapViews list. These views are unordered. * * @param scrap * The view to add */ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) void addScrapView(View scrap, int position, int viewType) { // create a new Scrap Scrap item = new Scrap(scrap, true); if (viewTypeCount == 1) { currentScraps.put(position, item); } else { scraps[viewType].put(position, item); } if (Build.VERSION.SDK_INT >= 14) { scrap.setAccessibilityDelegate(null); } } static Scrap retrieveFromScrap(SparseArray<Scrap> scrapViews, int position) { int size = scrapViews.size(); if (size > 0) { // See if we still have a view for this position. Scrap result = scrapViews.get(position, null); if (result != null) { scrapViews.remove(position); return result; } int index = size - 1; result = scrapViews.valueAt(index); scrapViews.removeAt(index); result.valid = false; return result; } return null; } void invalidateScraps() { for (SparseArray<Scrap> array : scraps) { for (int i = 0; i < array.size(); i++) { array.valueAt(i).valid = false; } } } }