diff options
Diffstat (limited to 'src/com/android/tv/ui/sidepanel/SideFragment.java')
-rw-r--r-- | src/com/android/tv/ui/sidepanel/SideFragment.java | 158 |
1 files changed, 76 insertions, 82 deletions
diff --git a/src/com/android/tv/ui/sidepanel/SideFragment.java b/src/com/android/tv/ui/sidepanel/SideFragment.java index 8df56cd2..6bd921a2 100644 --- a/src/com/android/tv/ui/sidepanel/SideFragment.java +++ b/src/com/android/tv/ui/sidepanel/SideFragment.java @@ -26,32 +26,36 @@ import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.FrameLayout; import android.widget.TextView; import com.android.tv.MainActivity; import com.android.tv.R; import com.android.tv.TvApplication; -import com.android.tv.analytics.DurationTimer; +import com.android.tv.util.DurationTimer; import com.android.tv.analytics.HasTrackerLabel; import com.android.tv.analytics.Tracker; import com.android.tv.data.ChannelDataManager; import com.android.tv.data.ProgramDataManager; import com.android.tv.util.SystemProperties; +import com.android.tv.util.ViewCache; import java.util.List; -public abstract class SideFragment extends Fragment implements HasTrackerLabel { +public abstract class SideFragment<T extends Item> extends Fragment implements HasTrackerLabel { public static final int INVALID_POSITION = -1; - private static final int RECYCLED_VIEW_POOL_SIZE = 7; - private static final int[] PRELOADED_VIEW_IDS = { + private static final int PRELOAD_VIEW_SIZE = 7; + private static final int[] PRELOAD_VIEW_IDS = { R.layout.option_item_radio_button, R.layout.option_item_channel_lock, R.layout.option_item_check_box, - R.layout.option_item_channel_check + R.layout.option_item_channel_check, + R.layout.option_item_action }; - private static RecyclerView.RecycledViewPool sRecycledViewPool; + private static RecyclerView.RecycledViewPool sRecycledViewPool = + new RecyclerView.RecycledViewPool(); private VerticalGridView mListView; private ItemAdapter mAdapter; @@ -89,14 +93,8 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - if (sRecycledViewPool == null) { - // sRecycledViewPool should be initialized by calling preloadRecycledViews() - // before the entering animation of this fragment starts, - // because it takes long time and if it is called after the animation starts (e.g. here) - // it can affect the animation. - throw new IllegalStateException("The RecyclerView pool has not been initialized."); - } - View view = inflater.inflate(getFragmentLayoutResourceId(), container, false); + View view = ViewCache.getInstance().getOrCreateView( + inflater, getFragmentLayoutResourceId(), container); TextView textView = (TextView) view.findViewById(R.id.side_panel_title); textView.setText(getTitle()); @@ -158,7 +156,7 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel { return mListView.getSelectedPosition(); } - public void setItems(List<Item> items) { + public void setItems(List<T> items) { mAdapter.reset(items); } @@ -229,56 +227,50 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel { protected abstract String getTitle(); @Override public abstract String getTrackerLabel(); - protected abstract List<Item> getItemList(); + protected abstract List<T> getItemList(); public interface SideFragmentListener { void onSideFragmentViewDestroyed(); } /** - * Preloads the view holders. + * Preloads the item views. */ - public static void preloadRecycledViews(Context context) { - if (sRecycledViewPool != null) { - return; - } - sRecycledViewPool = new RecyclerView.RecycledViewPool(); - LayoutInflater inflater = - (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); - for (int id : PRELOADED_VIEW_IDS) { - sRecycledViewPool.setMaxRecycledViews(id, RECYCLED_VIEW_POOL_SIZE); - for (int j = 0; j < RECYCLED_VIEW_POOL_SIZE; ++j) { - ItemAdapter.ViewHolder viewHolder = new ItemAdapter.ViewHolder( - inflater.inflate(id, null, false)); - sRecycledViewPool.putRecycledView(viewHolder); - } + public static void preloadItemViews(Context context) { + ViewCache.getInstance().putView( + context, R.layout.option_fragment, new FrameLayout(context), 1); + VerticalGridView fakeParent = new VerticalGridView(context); + for (int id : PRELOAD_VIEW_IDS) { + sRecycledViewPool.setMaxRecycledViews(id, PRELOAD_VIEW_SIZE); + ViewCache.getInstance().putView(context, id, fakeParent, PRELOAD_VIEW_SIZE); } } /** - * Releases the pre-loaded view holders. + * Releases the recycled view pool. */ - public static void releasePreloadedRecycledViews() { - sRecycledViewPool = null; + public static void releaseRecycledViewPool() { + sRecycledViewPool.clear(); } - private static class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> { + private static class ItemAdapter<T extends Item> extends RecyclerView.Adapter<ViewHolder> { private final LayoutInflater mLayoutInflater; - private List<Item> mItems; + private List<T> mItems; - private ItemAdapter(LayoutInflater layoutInflater, List<Item> items) { + private ItemAdapter(LayoutInflater layoutInflater, List<T> items) { mLayoutInflater = layoutInflater; mItems = items; } - private void reset(List<Item> items) { + private void reset(List<T> items) { mItems = items; notifyDataSetChanged(); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - return new ViewHolder(mLayoutInflater.inflate(viewType, parent, false)); + View view = ViewCache.getInstance().getOrCreateView(mLayoutInflater, viewType, parent); + return new ViewHolder(view); } @Override @@ -301,11 +293,11 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel { return mItems == null ? 0 : mItems.size(); } - private Item getItem(int position) { + private T getItem(int position) { return mItems.get(position); } - private void clearRadioGroup(Item item) { + private void clearRadioGroup(T item) { int position = mItems.indexOf(item); for (int i = position - 1; i >= 0; --i) { if ((item = mItems.get(i)) instanceof RadioButtonItem) { @@ -322,55 +314,57 @@ public abstract class SideFragment extends Fragment implements HasTrackerLabel { } } } + } - private static class ViewHolder extends RecyclerView.ViewHolder - implements View.OnClickListener, View.OnFocusChangeListener { - private ItemAdapter mAdapter; - public Item mItem; + private static class ViewHolder extends RecyclerView.ViewHolder + implements View.OnClickListener, View.OnFocusChangeListener { + private ItemAdapter mAdapter; + public Item mItem; - private ViewHolder(View view) { - super(view); - itemView.setOnClickListener(this); - itemView.setOnFocusChangeListener(this); - } + private ViewHolder(View view) { + super(view); + itemView.setOnClickListener(this); + itemView.setOnFocusChangeListener(this); + } - public void onBind(ItemAdapter adapter, Item item) { - mAdapter = adapter; - mItem = item; - mItem.onBind(itemView); - mItem.onUpdate(); - } + public void onBind(ItemAdapter adapter, Item item) { + mAdapter = adapter; + mItem = item; + mItem.onBind(itemView); + mItem.onUpdate(); + } - public void onUnbind() { - mItem.onUnbind(); - mItem = null; - mAdapter = null; - } + public void onUnbind() { + mItem.onUnbind(); + mItem = null; + mAdapter = null; + } - @Override - public void onClick(View view) { - if (mItem instanceof RadioButtonItem) { - mAdapter.clearRadioGroup(mItem); - } - if (view.getBackground() instanceof RippleDrawable) { - view.postDelayed(new Runnable() { - @Override - public void run() { - if (mItem != null) { - mItem.onSelected(); + @Override + public void onClick(View view) { + if (mItem instanceof RadioButtonItem) { + mAdapter.clearRadioGroup(mItem); + } + if (view.getBackground() instanceof RippleDrawable) { + view.postDelayed( + new Runnable() { + @Override + public void run() { + if (mItem != null) { + mItem.onSelected(); + } } - } - }, view.getResources().getInteger(R.integer.side_panel_ripple_anim_duration)); - } else { - mItem.onSelected(); - } + }, + view.getResources().getInteger(R.integer.side_panel_ripple_anim_duration)); + } else { + mItem.onSelected(); } + } - @Override - public void onFocusChange(View view, boolean focusGained) { - if (focusGained) { - mItem.onFocused(); - } + @Override + public void onFocusChange(View view, boolean focusGained) { + if (focusGained) { + mItem.onFocused(); } } } |