1 package com.android.tv.util; 2 3 import android.content.Context; 4 import android.util.SparseArray; 5 import android.view.LayoutInflater; 6 import android.view.View; 7 import android.view.ViewGroup; 8 9 import java.util.ArrayList; 10 11 /** 12 * A cache for the views. 13 */ 14 public class ViewCache { 15 private final static SparseArray<ArrayList<View>> mViews = new SparseArray(); 16 17 private static ViewCache sViewCache; 18 ViewCache()19 private ViewCache() { } 20 21 /** 22 * Returns an instance of the view cache. 23 */ getInstance()24 public static ViewCache getInstance() { 25 if (sViewCache == null) { 26 sViewCache = new ViewCache(); 27 } 28 return sViewCache; 29 } 30 31 /** 32 * Returns if the view cache is empty. 33 */ isEmpty()34 public boolean isEmpty() { 35 return mViews.size() == 0; 36 } 37 38 /** 39 * Stores a view into this view cache. 40 */ putView(int resId, View view)41 public void putView(int resId, View view) { 42 ArrayList<View> views = mViews.get(resId); 43 if (views == null) { 44 views = new ArrayList(); 45 mViews.put(resId, views); 46 } 47 views.add(view); 48 } 49 50 /** 51 * Stores multi specific views into the view cache. 52 */ putView(Context context, int resId, ViewGroup fakeParent, int num)53 public void putView(Context context, int resId, ViewGroup fakeParent, int num) { 54 LayoutInflater inflater = 55 (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 56 ArrayList<View> views = mViews.get(resId); 57 if (views == null) { 58 views = new ArrayList<>(); 59 mViews.put(resId, views); 60 } 61 for (int i = 0; i < num; i++) { 62 View view = inflater.inflate(resId, fakeParent, false); 63 views.add(view); 64 } 65 } 66 67 /** 68 * Returns the view for specific resource id. 69 */ getView(int resId)70 public View getView(int resId) { 71 ArrayList<View> views = mViews.get(resId); 72 if (views != null && !views.isEmpty()) { 73 View view = views.remove(views.size() - 1); 74 if (views.isEmpty()) { 75 mViews.remove(resId); 76 } 77 return view; 78 } else { 79 return null; 80 } 81 } 82 83 /** 84 * Returns the view if exists, or create a new view for the specific resource id. 85 */ getOrCreateView(LayoutInflater inflater, int resId, ViewGroup container)86 public View getOrCreateView(LayoutInflater inflater, int resId, ViewGroup container) { 87 View view = getView(resId); 88 if (view == null) { 89 view = inflater.inflate(resId, container, false); 90 } 91 return view; 92 } 93 94 /** 95 * Clears the view cache. 96 */ clear()97 public void clear() { 98 mViews.clear(); 99 } 100 } 101