TypedPagedListAdapter.java revision d28162c2c6c760c760125f444069841f1e4d21d9
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;
43b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    private final ArrayList<LineItem> mContentList;
44b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
45b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public TypedPagedListAdapter(@NonNull Context context, ArrayList<LineItem> contentList) {
46b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        mContext = context;
47b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        mContentList = contentList;
48b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
49b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
50b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public boolean isEmpty() {
51b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        return mContentList.isEmpty();
52b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
53b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
54b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue    public static abstract class LineItem<VH extends ViewHolder> {
55b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        @Retention(SOURCE)
56b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        @IntDef({TEXT_TYPE,
57b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                TOGGLE_TYPE,
58b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                ICON_TEXT_TYPE,
59b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                SEEKBAR_TYPE,
60b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                ICON_TOGGLE_TYPE,
61b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                SIMPLE_ICON_TEXT_TYPE})
62b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        public @interface LineItemType {}
63b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
64b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        // with one title and one description
65b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        static final int TEXT_TYPE = 1;
66b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
67b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        // with one tile, one description, and a toggle on the right.
68b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        static final int TOGGLE_TYPE = 2;
69b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
70b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue        // with one icon, one tile and one description.
71b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue        static final int ICON_TEXT_TYPE = 3;
72b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue
73d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue        // with one tile and one seekbar.
74d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue        static final int SEEKBAR_TYPE = 4;
75d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue
76b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        // with one icon, title, description and a toggle.
77b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        static final int ICON_TOGGLE_TYPE = 5;
78b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
79b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        // similar to ICON_TEXT_TYPE, but with a different layout.
80b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        static final int SIMPLE_ICON_TEXT_TYPE = 6;
81b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue
82b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        @LineItemType
83b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        abstract int getType();
84b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
85b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue        abstract void bindViewHolder(VH holder);
86b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
87b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        public abstract CharSequence getDesc();
88b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
89b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
90b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
91b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
92b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        switch (viewType) {
93b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue            case LineItem.TEXT_TYPE:
94b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue                return TextLineItem.createViewHolder(parent);
95b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue            case LineItem.TOGGLE_TYPE:
96b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue                return ToggleLineItem.createViewHolder(parent);
97b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue            case LineItem.ICON_TEXT_TYPE:
98b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue                return IconTextLineItem.createViewHolder(parent);
99d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue            case LineItem.SEEKBAR_TYPE:
100d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue                return SeekbarLineItem.createViewHolder(parent);
101b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            case LineItem.ICON_TOGGLE_TYPE:
102b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                return IconToggleLineItem.createViewHolder(parent);
103b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue            case LineItem.SIMPLE_ICON_TEXT_TYPE:
104b65a076987f188b26e9faa2fb3bae37bff2cb3earoger xue                return SimpleIconLineItem.createViewHolder(parent);
105b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue            default:
106b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue                throw new IllegalStateException("ViewType not supported: " + viewType);
107b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        }
108b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
109b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
110b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
111b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public void onBindViewHolder(ViewHolder holder, int position) {
112b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        mContentList.get(position).bindViewHolder(holder);
113b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
114b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
115b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
116b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @LineItem.LineItemType
117b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public int getItemViewType(int position) {
118b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        return mContentList.get(position).getType();
119b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
120b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
121b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
122b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public int getItemCount() {
123b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        return mContentList.size();
124b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
125b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
126b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
127b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public void setMaxItems(int maxItems) {
128b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        // no limit in this list.
129b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
130b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue}
131