10e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen/*
20e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * Copyright 2018 The Android Open Source Project
30e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen *
40e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * Licensed under the Apache License, Version 2.0 (the "License");
50e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * you may not use this file except in compliance with the License.
60e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * You may obtain a copy of the License at
70e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen *
80e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen *      http://www.apache.org/licenses/LICENSE-2.0
90e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen *
100e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * Unless required by applicable law or agreed to in writing, software
110e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * distributed under the License is distributed on an "AS IS" BASIS,
120e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * See the License for the specific language governing permissions and
140e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * limitations under the License.
150e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen */
160e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
170e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenpackage com.example.androidx.car;
180e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
190e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenimport android.app.Activity;
200e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenimport android.content.Context;
210e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenimport android.os.Bundle;
220e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenimport android.os.Handler;
230e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
240e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenimport androidx.car.widget.ListItem;
250e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenimport androidx.car.widget.ListItemAdapter;
260e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenimport androidx.car.widget.ListItemProvider;
270e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenimport androidx.car.widget.PagedListView;
280e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenimport androidx.car.widget.TextListItem;
290e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
300e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen/**
310e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * A demo activity that will display a {@link PagedListView} that has less items than can fit
320e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * on the screen and will vertically center these. This activity will continually add more
330e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen * items as time goes on.
340e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen */
350e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chenpublic class VerticallyCenteredListDemo extends Activity {
360e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen    private static final int ADD_ITEM_DELAY_MS = 1000;
370e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen    private static final int MAX_NUM_OF_ITEMS_TO_ADD = 10;
380e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
390e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen    private int mNumOfItemsAdded;
400e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
410e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen    @Override
420e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen    protected void onCreate(Bundle savedInstanceState) {
430e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        super.onCreate(savedInstanceState);
440e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        setContentView(R.layout.vertically_centered_paged_list_view);
450e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
460e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        PagedListView list = findViewById(R.id.paged_list_view);
470e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
480e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        CustomListProvider provider = new CustomListProvider(/* context= */ this);
490e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        ListItemAdapter adapter = new ListItemAdapter(/* context= */ this, provider);
500e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
510e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        list.setAdapter(adapter);
520e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
530e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        Handler handler = new Handler();
540e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
550e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        // Continually add items to the list until MAX_NUM_OF_ITEMS_TO_ADD is reached.
560e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        handler.postDelayed(new Runnable() {
570e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen            @Override
580e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen            public void run() {
590e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen                if (++mNumOfItemsAdded >= MAX_NUM_OF_ITEMS_TO_ADD) {
600e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen                    return;
610e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen                }
620e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
630e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen                provider.addListItem();
640e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen                adapter.notifyDataSetChanged();
650e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen                handler.postDelayed(this, ADD_ITEM_DELAY_MS);
660e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen            }
670e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        }, ADD_ITEM_DELAY_MS);
680e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen    }
690e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
700e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen    /**
710e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen     * A custom {@link ListItemProvider} that allows additional {@link ListItem}s to be added to it.
720e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen     */
730e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen    private static class CustomListProvider extends ListItemProvider {
740e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        private static final int INITIAL_NUM_OF_ITEMS = 3;
750e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
760e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        private int mNumOfItems = INITIAL_NUM_OF_ITEMS;
770e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        private final Context mContext;
780e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
790e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        CustomListProvider(Context context) {
800e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen            mContext = context;
810e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        }
820e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
830e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        public void addListItem() {
840e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen            mNumOfItems++;
850e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        }
860e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
870e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        public ListItem get(int position) {
880e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen            TextListItem item = new TextListItem(mContext);
890e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen            item.setTitle("Item " + position);
900e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen            return item;
910e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        }
920e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
930e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        public int size() {
940e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen            return mNumOfItems;
950e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen        }
960e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen
970e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen    }
980e3083a5009aeb26ba67892cf565d3973f89435bAnthony Chen}
99