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