diff options
Diffstat (limited to 'src/com/android/tv/util/ViewCache.java')
-rw-r--r-- | src/com/android/tv/util/ViewCache.java | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/com/android/tv/util/ViewCache.java b/src/com/android/tv/util/ViewCache.java new file mode 100644 index 00000000..ed9a8ff6 --- /dev/null +++ b/src/com/android/tv/util/ViewCache.java @@ -0,0 +1,100 @@ +package com.android.tv.util; + +import android.content.Context; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import java.util.ArrayList; + +/** + * A cache for the views. + */ +public class ViewCache { + private final static SparseArray<ArrayList<View>> mViews = new SparseArray(); + + private static ViewCache sViewCache; + + private ViewCache() { } + + /** + * Returns an instance of the view cache. + */ + public static ViewCache getInstance() { + if (sViewCache == null) { + sViewCache = new ViewCache(); + } + return sViewCache; + } + + /** + * Returns if the view cache is empty. + */ + public boolean isEmpty() { + return mViews.size() == 0; + } + + /** + * Stores a view into this view cache. + */ + public void putView(int resId, View view) { + ArrayList<View> views = mViews.get(resId); + if (views == null) { + views = new ArrayList(); + mViews.put(resId, views); + } + views.add(view); + } + + /** + * Stores multi specific views into the view cache. + */ + public void putView(Context context, int resId, ViewGroup fakeParent, int num) { + LayoutInflater inflater = + (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + ArrayList<View> views = mViews.get(resId); + if (views == null) { + views = new ArrayList<>(); + mViews.put(resId, views); + } + for (int i = 0; i < num; i++) { + View view = inflater.inflate(resId, fakeParent, false); + views.add(view); + } + } + + /** + * Returns the view for specific resource id. + */ + public View getView(int resId) { + ArrayList<View> views = mViews.get(resId); + if (views != null && !views.isEmpty()) { + View view = views.remove(views.size() - 1); + if (views.isEmpty()) { + mViews.remove(resId); + } + return view; + } else { + return null; + } + } + + /** + * Returns the view if exists, or create a new view for the specific resource id. + */ + public View getOrCreateView(LayoutInflater inflater, int resId, ViewGroup container) { + View view = getView(resId); + if (view == null) { + view = inflater.inflate(resId, container, false); + } + return view; + } + + /** + * Clears the view cache. + */ + public void clear() { + mViews.clear(); + } +} |