19b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana/* 29b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * Copyright (C) 2017 The Android Open Source Project 39b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * 49b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * Licensed under the Apache License, Version 2.0 (the "License"); 59b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * you may not use this file except in compliance with the License. 69b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * You may obtain a copy of the License at 79b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * 89b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * http://www.apache.org/licenses/LICENSE-2.0 99b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * 109b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * Unless required by applicable law or agreed to in writing, software 119b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * distributed under the License is distributed on an "AS IS" BASIS, 129b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * See the License for the specific language governing permissions and 149b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * limitations under the License. 159b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana */ 169b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 179b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanapackage androidx.car.widget; 189b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 19c5bcb56b9b4ae59dd52acf07764a69c8d1216ec0Yao, Yuxingimport static org.hamcrest.Matchers.closeTo; 20172425512285f6da3c69b9405738df1f064336c1Yao, Yuxingimport static org.hamcrest.Matchers.greaterThan; 219b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.hamcrest.Matchers.is; 22172425512285f6da3c69b9405738df1f064336c1Yao, Yuxingimport static org.hamcrest.core.IsNull.notNullValue; 239b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.junit.Assert.assertEquals; 249b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.junit.Assert.assertFalse; 259b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.junit.Assert.assertThat; 269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport static org.junit.Assert.assertTrue; 279b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 289b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.content.pm.PackageManager; 299b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.support.test.InstrumentationRegistry; 309b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.support.test.filters.MediumTest; 319b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.support.test.rule.ActivityTestRule; 329b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.support.test.runner.AndroidJUnit4; 339b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.view.LayoutInflater; 349b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.view.View; 359b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.view.ViewGroup; 369b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport android.widget.TextView; 379b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 3876dcad7e204288db0d0c1a50619054c8513336f4Anthony Chenimport androidx.car.test.R; 3976dcad7e204288db0d0c1a50619054c8513336f4Anthony Chenimport androidx.recyclerview.widget.RecyclerView; 4076dcad7e204288db0d0c1a50619054c8513336f4Anthony Chen 413737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxingimport org.junit.Assume; 429b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport org.junit.Before; 439b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport org.junit.Rule; 449b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport org.junit.Test; 459b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport org.junit.runner.RunWith; 469b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 479b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport java.util.ArrayList; 489b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport java.util.Arrays; 499b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanaimport java.util.List; 509b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 519b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana/** Unit tests for implementations of {@link PagedListView.DividerVisibilityManager}. */ 529b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana@RunWith(AndroidJUnit4.class) 539b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana@MediumTest 549b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovanapublic final class DividerVisibilityManagerTest { 559b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 569b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana /** 579b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * Used by {@link TestAdapter} to calculate ViewHolder height so N items appear in one page of 589b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * {@link PagedListView}. If you need to test behavior under multiple pages, set number of items 599b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * to ITEMS_PER_PAGE * desired_pages. 609b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana * Actual value does not matter. 619b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana */ 629b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private static final int ITEMS_PER_PAGE = 10; 639b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 649b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana @Rule 659b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana public ActivityTestRule<DividerVisibilityManagerTestActivity> mActivityRule = 669b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana new ActivityTestRule<>(DividerVisibilityManagerTestActivity.class); 679b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 689b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private DividerVisibilityManagerTestActivity mActivity; 699b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private PagedListView mPagedListView; 709b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 719b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana /** Returns {@code true} if the testing device has the automotive feature flag. */ 729b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private boolean isAutoDevice() { 739b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana PackageManager packageManager = mActivityRule.getActivity().getPackageManager(); 749b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana return packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE); 759b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 769b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 773737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing @Before 783737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing public void setUp() { 793737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing Assume.assumeTrue(isAutoDevice()); 803737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 813737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing mActivity = mActivityRule.getActivity(); 823737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing mPagedListView = mActivity.findViewById(R.id.paged_list_view_with_dividers); 833737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing } 843737d1dff953969c27652b49b010ea9902b3da4fYao, Yuxing 859b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana /** Sets up {@link #mPagedListView} with the given number of items. */ 869b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private void setUpPagedListView(int itemCount) { 879b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana try { 889b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mActivityRule.runOnUiThread(() -> { 899b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mPagedListView.setMaxPages(PagedListView.ItemCap.UNLIMITED); 909b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mPagedListView.setAdapter( 919b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana new TestAdapter(itemCount, mPagedListView.getMeasuredHeight())); 929b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana }); 939b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } catch (Throwable throwable) { 949b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana throwable.printStackTrace(); 959b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana throw new RuntimeException(throwable); 969b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 979b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 989b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 999b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana @Test 1009b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana public void setCustomDividerVisibilityManager() throws Throwable { 1019b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana final int itemCount = 8; 1029b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana setUpPagedListView(itemCount /* itemCount */); 1039b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana RecyclerView.LayoutManager layoutManager = 1049b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mPagedListView.getRecyclerView().getLayoutManager(); 1059b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 1069b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana // Fetch divider height. 1079b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana final int dividerHeight = InstrumentationRegistry.getContext().getResources() 1089b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana .getDimensionPixelSize(R.dimen.car_list_divider_height); 1099b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 1109b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 1119b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana // Initially, dividers are present between each two items. 1129b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana final View[] views = new View[itemCount]; 1139b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mActivityRule.runOnUiThread(() -> { 1149b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana for (int i = 0; i < layoutManager.getChildCount(); i++) { 1159b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana views[i] = layoutManager.getChildAt(i); 1169b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 1179b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana }); 1189b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana for (int i = 0; i < itemCount - 1; i++) { 119c5bcb56b9b4ae59dd52acf07764a69c8d1216ec0Yao, Yuxing assertThat((double) views[i + 1].getTop() - views[i].getBottom(), 120c5bcb56b9b4ae59dd52acf07764a69c8d1216ec0Yao, Yuxing is(closeTo(2 * (dividerHeight / 2), 1.0f))); 1219b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 1229b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 1239b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 1249b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana // Set DividerVisibilityManager on PagedListView. 1259b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana final PagedListView.DividerVisibilityManager dvm = new TestDividerVisibilityManager(); 1269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mActivityRule.runOnUiThread(() -> { 1279b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mPagedListView.setDividerVisibilityManager(dvm); 1289b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana }); 1299b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 1309b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mActivityRule.runOnUiThread(() -> { 1319b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana for (int i = 0; i < layoutManager.getChildCount(); i++) { 1329b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana views[i] = layoutManager.getChildAt(i); 1339b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 1349b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana }); 1359b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 1369b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana for (int i = 0; i < itemCount - 1; i++) { 1379b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana int distance = views[i + 1].getTop() - views[i].getBottom(); 1389b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana if (dvm.shouldHideDivider(i)) { 1399b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertEquals(distance, 0); 1409b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } else { 141c5bcb56b9b4ae59dd52acf07764a69c8d1216ec0Yao, Yuxing assertThat((double) distance, is(closeTo(2 * (dividerHeight / 2), 1.0f))); 1429b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 1439b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 1449b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 1459b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 1469b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana @Test 1479b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana public void testListItemAdapterAsVisibilityManager() { 148172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 149172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setHideDivider(true); 150172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 151172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 152172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item1.setHideDivider(false); 153172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 154172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item2 = new TextListItem(mActivity); 155172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item2.setHideDivider(true); 156172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 157172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item3 = new TextListItem(mActivity); 158172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item3.setHideDivider(true); 159172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 1609b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana // Create and populate ListItemAdapter. 1619b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana ListItemProvider provider = new ListItemProvider.ListProvider(Arrays.asList( 162172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0, item1, item2, item3)); 1639b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 1649b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana ListItemAdapter itemAdapter = new ListItemAdapter(mActivity, provider); 1659b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertTrue(itemAdapter.shouldHideDivider(0)); 1669b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertFalse(itemAdapter.shouldHideDivider(1)); 1679b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertTrue(itemAdapter.shouldHideDivider(2)); 1689b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana assertTrue(itemAdapter.shouldHideDivider(3)); 1699b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 1709b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 171172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing @Test 172172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing public void testSettingItemDividersHidden() throws Throwable { 173172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item0 = new TextListItem(mActivity); 174172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setHideDivider(true); 175172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 176172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing TextListItem item1 = new TextListItem(mActivity); 177172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 178172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing ListItemProvider provider = new ListItemProvider.ListProvider(Arrays.asList(item0, item1)); 179172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing mActivityRule.runOnUiThread(() -> { 180172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing mPagedListView.setAdapter(new ListItemAdapter(mActivity, provider)); 181172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing }); 182172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 183172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(item0.shouldHideDivider(), is(true)); 184172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(item1.shouldHideDivider(), is(false)); 185172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 186172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // First verify hiding divider works. 187172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing PagedListView.DividerVisibilityManager dvm = (PagedListView.DividerVisibilityManager) 188172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing mPagedListView.getAdapter(); 189172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(dvm, is(notNullValue())); 190172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(dvm.shouldHideDivider(0), is(true)); 191172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(dvm.shouldHideDivider(1), is(false)); 192172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 193172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // Then verify we can show divider by checking the space between items reserved by 194172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing // divider decorator. 195172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing item0.setHideDivider(false); 196172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing mActivityRule.runOnUiThread(() -> { 197172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing mPagedListView.getAdapter().notifyDataSetChanged(); 198172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing }); 199172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 200172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(dvm.shouldHideDivider(0), is(false)); 201172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing int upper = mPagedListView.getRecyclerView().getLayoutManager() 202172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing .findViewByPosition(0).getBottom(); 203172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing int lower = mPagedListView.getRecyclerView().getLayoutManager() 204172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing .findViewByPosition(1).getTop(); 205172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing assertThat(lower - upper, is(greaterThan(0))); 206172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing } 207172425512285f6da3c69b9405738df1f064336c1Yao, Yuxing 2089b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private class TestDividerVisibilityManager implements PagedListView.DividerVisibilityManager { 2099b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana @Override 2109b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana public boolean shouldHideDivider(int position) { 2119b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana // Hide divider after items at even positions, show after items at odd positions. 2129b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana return position % 2 == 0; 2139b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2149b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2159b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2169b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private static String itemText(int index) { 2179b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana return "Data " + index; 2189b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2199b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2209b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana /** A base adapter that will handle inflating the test view and binding data to it. */ 2219b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private class TestAdapter extends RecyclerView.Adapter<TestViewHolder> { 2229b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private List<String> mData; 2239b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private int mParentHeight; 2249b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2259b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana TestAdapter(int itemCount, int parentHeight) { 2269b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mData = new ArrayList<>(); 2279b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana for (int i = 0; i < itemCount; i++) { 2289b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mData.add(itemText(i)); 2299b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2309b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mParentHeight = parentHeight; 2319b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2329b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2339b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana @Override 2349b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 2359b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 2369b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana return new TestViewHolder(inflater, parent); 2379b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2389b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2399b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana @Override 2409b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana public void onBindViewHolder(TestViewHolder holder, int position) { 2419b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana // Calculate height for an item so one page fits ITEMS_PER_PAGE items. 2429b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana int height = (int) Math.floor(mParentHeight / ITEMS_PER_PAGE); 2439b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana holder.itemView.setMinimumHeight(height); 2449b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana holder.bind(mData.get(position)); 2459b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2469b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2479b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana @Override 2489b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana public int getItemCount() { 2499b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana return mData.size(); 2509b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2519b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2529b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2539b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private class TestViewHolder extends RecyclerView.ViewHolder { 2549b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana private TextView mTextView; 2559b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2569b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana TestViewHolder(LayoutInflater inflater, ViewGroup parent) { 2579b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana super(inflater.inflate(R.layout.paged_list_item_column_card, parent, false)); 2589b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mTextView = itemView.findViewById(R.id.text_view); 2599b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2609b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana 2619b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana public void bind(String text) { 2629b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana mTextView.setText(text); 2639b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2649b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana } 2659b0ebd7c98d4c0d73c101851014ecc5f4b70471aJovana} 266