TypedPagedListAdapter.java revision 664ed2dc2488c50194a80004af759a765f0ce18f
1b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue/* 2b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * Copyright (C) 2017 The Android Open Source Project 3b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * 4b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * Licensed under the Apache License, Version 2.0 (the "License"); 5b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * you may not use this file except in compliance with the License. 6b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * You may obtain a copy of the License at 7b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * 8b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * http://www.apache.org/licenses/LICENSE-2.0 9b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * 10b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * Unless required by applicable law or agreed to in writing, software 11b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * distributed under the License is distributed on an "AS IS" BASIS, 12b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * See the License for the specific language governing permissions and 14b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * limitations under the License 15b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue */ 16b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 17b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xuepackage com.android.car.settings.common; 18b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 19b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport static java.lang.annotation.RetentionPolicy.SOURCE; 20b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 21b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.annotation.IntDef; 22b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.annotation.NonNull; 23b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.content.Context; 24b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.support.v7.widget.RecyclerView; 25b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.support.v7.widget.RecyclerView.ViewHolder; 26b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.view.ViewGroup; 27b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 28b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport com.android.car.settings.R; 29d28162c2c6c760c760125f444069841f1e4d21d9Rakesh Iyerimport com.android.car.view.PagedListView; 30b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 31b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport java.lang.annotation.Retention; 32b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport java.util.ArrayList; 33b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 34b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue/** 35b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue * Renders all types of LineItem to a view to be displayed as a row in a list. 36b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue */ 37b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xuepublic class TypedPagedListAdapter 38b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue extends RecyclerView.Adapter<ViewHolder> 39b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue implements PagedListView.ItemCap { 40b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue private static final String TAG = "TypedPagedListAdapter"; 41b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 42b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue private final Context mContext; 4324b50803fa603b04e74752beb19f85038515919aroger xue private ArrayList<? extends LineItem> mContentList; 44b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 4524b50803fa603b04e74752beb19f85038515919aroger xue public TypedPagedListAdapter(@NonNull Context context) { 4624b50803fa603b04e74752beb19f85038515919aroger xue this(context, new ArrayList<>()); 4724b50803fa603b04e74752beb19f85038515919aroger xue } 4824b50803fa603b04e74752beb19f85038515919aroger xue 4924b50803fa603b04e74752beb19f85038515919aroger xue public TypedPagedListAdapter( 5024b50803fa603b04e74752beb19f85038515919aroger xue @NonNull Context context, ArrayList<? extends LineItem> contentList) { 51b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue mContext = context; 52b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue mContentList = contentList; 53b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 54b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 5524b50803fa603b04e74752beb19f85038515919aroger xue public void updateList(ArrayList<? extends LineItem> contentList) { 5624b50803fa603b04e74752beb19f85038515919aroger xue mContentList = contentList; 5724b50803fa603b04e74752beb19f85038515919aroger xue notifyDataSetChanged(); 5824b50803fa603b04e74752beb19f85038515919aroger xue } 5924b50803fa603b04e74752beb19f85038515919aroger xue 60b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public boolean isEmpty() { 61b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return mContentList.isEmpty(); 62b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 63b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 64b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue public static abstract class LineItem<VH extends ViewHolder> { 65b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Retention(SOURCE) 66b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue @IntDef({TEXT_TYPE, 67b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue TOGGLE_TYPE, 68b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue ICON_TEXT_TYPE, 69b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue SEEKBAR_TYPE, 705e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue ICON_TOGGLE_TYPE, 71fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue CHECKBOX_TYPE, 72fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue EDIT_TEXT_TYPE, 73664ed2dc2488c50194a80004af759a765f0ce18froger xue SINGLE_TEXT_TYPE, 74664ed2dc2488c50194a80004af759a765f0ce18froger xue SPINNER_TYPE, 75664ed2dc2488c50194a80004af759a765f0ce18froger xue PASSWORD_TYPE}) 76b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public @interface LineItemType {} 77b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 78b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue // with one title and one description 79b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue static final int TEXT_TYPE = 1; 80b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 81b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue // with one tile, one description, and a toggle on the right. 82b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue static final int TOGGLE_TYPE = 2; 83b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 84b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue // with one icon, one tile and one description. 85b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue static final int ICON_TEXT_TYPE = 3; 86b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue 87d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue // with one tile and one seekbar. 88d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue static final int SEEKBAR_TYPE = 4; 89d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue 90b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue // with one icon, title, description and a toggle. 91b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue static final int ICON_TOGGLE_TYPE = 5; 92b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue 935e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue // with one icon, title and a checkbox. 945e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue static final int CHECKBOX_TYPE = 6; 955e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue 96fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue // with one title and a EditText. 97fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue static final int EDIT_TEXT_TYPE = 7; 98fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue 99fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue // with one title. 100fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue static final int SINGLE_TEXT_TYPE = 8; 101fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue 102664ed2dc2488c50194a80004af759a765f0ce18froger xue // with a spinner. 103664ed2dc2488c50194a80004af759a765f0ce18froger xue static final int SPINNER_TYPE = 9; 104664ed2dc2488c50194a80004af759a765f0ce18froger xue 105664ed2dc2488c50194a80004af759a765f0ce18froger xue // with a password input window and a checkbox for show password or not. 106664ed2dc2488c50194a80004af759a765f0ce18froger xue static final int PASSWORD_TYPE = 10; 107664ed2dc2488c50194a80004af759a765f0ce18froger xue 108b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @LineItemType 109b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue abstract int getType(); 110b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 111b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue abstract void bindViewHolder(VH holder); 112b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 113b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public abstract CharSequence getDesc(); 1145e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue 1155e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue /** 1165e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue * Returns true if this item is ready to receive touch. If it's set to false, 1175e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue * this item maybe not clickable or temporarily not functional. 1185e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue */ 1195e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue public boolean isEnabled() { 1205e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue return true; 1215e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue } 1225e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue 1235e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue /** 1245e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue * Returns true if some component on this item can be clicked. 1255e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue */ 1265e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue public boolean isClickable() { 1275e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue return isExpandable(); 1285e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue } 1295e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue 1305e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue /** 1315e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue * Returns true if this item can launch another activity or fragment. 1325e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue */ 1335e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue public abstract boolean isExpandable(); 134b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 135b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 136b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 137b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 138b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue switch (viewType) { 139b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue case LineItem.TEXT_TYPE: 140b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return TextLineItem.createViewHolder(parent); 141b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue case LineItem.TOGGLE_TYPE: 142b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return ToggleLineItem.createViewHolder(parent); 143b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue case LineItem.ICON_TEXT_TYPE: 144b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue return IconTextLineItem.createViewHolder(parent); 145d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue case LineItem.SEEKBAR_TYPE: 146d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue return SeekbarLineItem.createViewHolder(parent); 147b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue case LineItem.ICON_TOGGLE_TYPE: 148b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue return IconToggleLineItem.createViewHolder(parent); 1495e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue case LineItem.CHECKBOX_TYPE: 1505e02a7c64fa4dbcbbef81e1e582ff381287f2e34roger xue return CheckBoxLineItem.createViewHolder(parent); 151fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue case LineItem.EDIT_TEXT_TYPE: 152fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue return EditTextLineItem.createViewHolder(parent); 153fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue case LineItem.SINGLE_TEXT_TYPE: 154fb860ae3a8fc08e78a6af077d4cd31ba46ac797droger xue return SingleTextLineItem.createViewHolder(parent); 155664ed2dc2488c50194a80004af759a765f0ce18froger xue case LineItem.SPINNER_TYPE: 156664ed2dc2488c50194a80004af759a765f0ce18froger xue return SpinnerLineItem.createViewHolder(parent); 157664ed2dc2488c50194a80004af759a765f0ce18froger xue case LineItem.PASSWORD_TYPE: 158664ed2dc2488c50194a80004af759a765f0ce18froger xue return PasswordLineItem.createViewHolder(parent); 159b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue default: 160b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue throw new IllegalStateException("ViewType not supported: " + viewType); 161b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 162b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 163b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 164b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 165b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public void onBindViewHolder(ViewHolder holder, int position) { 166b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue mContentList.get(position).bindViewHolder(holder); 167b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 168b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 169b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 170b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @LineItem.LineItemType 171b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public int getItemViewType(int position) { 172b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return mContentList.get(position).getType(); 173b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 174b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 175b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 176b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public int getItemCount() { 177b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue return mContentList.size(); 178b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 179b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue 180b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue @Override 181b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue public void setMaxItems(int maxItems) { 182b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue // no limit in this list. 183b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue } 184b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue} 185