TypedPagedListAdapter.java revision d91964dd49bc0e6a49ff43fb99c70ad2eca6dadd
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.car.ui.PagedListView;
25b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.support.v7.widget.RecyclerView;
26b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.support.v7.widget.RecyclerView.ViewHolder;
27b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport android.view.ViewGroup;
28b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
29b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xueimport com.android.car.settings.R;
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
54b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public static abstract class LineItem {
55b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        @Retention(SOURCE)
56b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue        @IntDef({TEXT_TYPE, TOGGLE_TYPE, ICON_TEXT_TYPE})
57b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        public @interface LineItemType {}
58b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
59b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        // with one title and one description
60b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        static final int TEXT_TYPE = 1;
61b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
62b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        // with one tile, one description, and a toggle on the right.
63b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        static final int TOGGLE_TYPE = 2;
64b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
65b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue        // with one icon, one tile and one description.
66b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue        static final int ICON_TEXT_TYPE = 3;
67b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue
68d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue        // with one tile and one seekbar.
69d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue        static final int SEEKBAR_TYPE = 4;
70d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue
71b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        @LineItemType
72b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        abstract int getType();
73b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
74b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        abstract void bindViewHolder(ViewHolder holder);
75b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
76b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        public abstract CharSequence getDesc();
77b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
78b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
79b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
80b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
81b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        switch (viewType) {
82b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue            case LineItem.TEXT_TYPE:
83b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue                return TextLineItem.createViewHolder(parent);
84b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue            case LineItem.TOGGLE_TYPE:
85b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue                return ToggleLineItem.createViewHolder(parent);
86b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue            case LineItem.ICON_TEXT_TYPE:
87b292bf2f6c9ea8176014d95c24d3ec3521c86448roger xue                return IconTextLineItem.createViewHolder(parent);
88d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue            case LineItem.SEEKBAR_TYPE:
89d91964dd49bc0e6a49ff43fb99c70ad2eca6daddroger xue                return SeekbarLineItem.createViewHolder(parent);
90b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue            default:
91b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue                throw new IllegalStateException("ViewType not supported: " + viewType);
92b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        }
93b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
94b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
95b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
96b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public void onBindViewHolder(ViewHolder holder, int position) {
97b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        mContentList.get(position).bindViewHolder(holder);
98b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
99b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
100b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
101b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @LineItem.LineItemType
102b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public int getItemViewType(int position) {
103b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        return mContentList.get(position).getType();
104b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
105b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
106b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
107b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public int getItemCount() {
108b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        return mContentList.size();
109b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
110b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue
111b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    @Override
112b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    public void setMaxItems(int maxItems) {
113b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue        // no limit in this list.
114b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue    }
115b9104e0e877d1f2334e1cbb1715c7fd320f62345roger xue}
116