diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b3a3f4..1df6850 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed ### Deprecated ### Added +- Added `notifyAdapterDataSetChanged()` method to the MultiChoiceAdapter in order to be able to keep a valid internal state of the selected/deselected items. This will then delegate the actual `RecyclerView.Adapter#notifyDataSetChanged()` to do the rest. + ### Fixed ### Deleted @@ -23,6 +25,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). and other configuration change - Added `deselect(int position)` method to the MultiChoiceAdapter + ## [2.1.0] ### Added - Possibility to use QuantityStrings for the toolbar while selecting items diff --git a/FEATURES.md b/FEATURES.md index 901a16a..b010de5 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -85,4 +85,7 @@ It will automatically keep the selection in place when orientation and other con // Mode boolean isInSingleClickMode() + + // Extra + void notifyAdapterDataSetChanged() ``` \ No newline at end of file diff --git a/README.md b/README.md index 574ad88..7006aef 100644 --- a/README.md +++ b/README.md @@ -69,9 +69,6 @@ Extend your adapter to the MultiChoiceAdapter and add it to the RecyclerView as mMultiChoiceRecyclerView.setAdapter(myAdapter); ``` -**N.B.** -- Do not forget to call **super.onBindViewHolder(holder, position);** when binding the view holder - Customize the activation or deactivation just overriding the setActive(View rootView, boolean state) method of the MultiChoiceAdapter ```java @Override @@ -87,6 +84,12 @@ Customize the activation or deactivation just overriding the setActive(View root } ``` +
+ +#### Important notes +- Do not forget to call `super.onBindViewHolder(holder, position)` when binding the view holder +- Use the method `notifyAdapterDataSetChanged()` instead of the classic `notifyDataSetChanged()` in order to let the library refresh the list and keep a correct internal library state. + ## Features [Sample features](https://github.com/dvdciri/MultiChoiceRecyclerView/blob/master/FEATURES.md) diff --git a/build.gradle b/build.gradle index 3379819..fcb93ec 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:2.3.0' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' diff --git a/circle.yml b/circle.yml index 6a35b70..ac9025f 100644 --- a/circle.yml +++ b/circle.yml @@ -9,9 +9,9 @@ machine: dependencies: pre: - echo y | android update sdk --no-ui --all --filter "tools" - - echo y | android update sdk --no-ui --all --filter "build-tools-23.0.3" - - echo y | android update sdk --no-ui --all --filter tool,extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository,android-23 - - echo y | android update sdk --no-ui --all --filter build-tools-23.4.0 + - echo y | android update sdk --no-ui --all --filter "build-tools-25.0.0" + - echo y | android update sdk --no-ui --all --filter tool,extra-android-m2repository,extra-android-support,extra-google-google_play_services,extra-google-m2repository,android-25 + - echo y | android update sdk --no-ui --all --filter build-tools-25.0.0 test: override: diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5b74049..2bef784 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Oct 07 18:10:10 BST 2016 +#Fri Mar 10 16:13:49 GMT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/library/multichoicerecyclerview/build.gradle b/library/multichoicerecyclerview/build.gradle index b5984bb..6acb125 100644 --- a/library/multichoicerecyclerview/build.gradle +++ b/library/multichoicerecyclerview/build.gradle @@ -8,10 +8,10 @@ checkstyle { } ext { - PUBLISH_VERSION = '2.3.0' - SUPPORT_LIBRARY_VERSION = '24.2.1' - BUILD_TOOLS = "23.0.3" - TARGET_SDK = 23 + PUBLISH_VERSION = '2.4.0' + SUPPORT_LIBRARY_VERSION = '25.3.1' + BUILD_TOOLS = "25.0.0" + TARGET_SDK = 25 PUBLISH_ARTIFACT_ID = 'multichoicerecyclerview' PUBLISH_GROUP_ID = 'com.davidecirillo.multichoicerecyclerview' @@ -54,7 +54,7 @@ android { lintOptions { // if true, stop the gradle build if errors are found abortOnError true - disable 'GoogleAppIndexingWarning' + disable 'GoogleAppIndexingWarning', 'UnusedResources' } buildTypes { diff --git a/library/multichoicerecyclerview/src/main/java/com/davidecirillo/multichoicerecyclerview/MultiChoiceAdapter.java b/library/multichoicerecyclerview/src/main/java/com/davidecirillo/multichoicerecyclerview/MultiChoiceAdapter.java index 0559866..485ef0d 100644 --- a/library/multichoicerecyclerview/src/main/java/com/davidecirillo/multichoicerecyclerview/MultiChoiceAdapter.java +++ b/library/multichoicerecyclerview/src/main/java/com/davidecirillo/multichoicerecyclerview/MultiChoiceAdapter.java @@ -83,7 +83,7 @@ public void selectAll() { * @return True if the view has been selected, False if the view is already selected or is not part of the item list */ public boolean select(int position) { - if (mItemList.containsKey(position) && mItemList.get(position) == State.INACTIVE) { + if (mItemList.containsKey(position) && mItemList.get(position) == State.INACTIVE) { perform(Action.SELECT, position, true, true); return true; } @@ -161,12 +161,22 @@ public void onRestoreInstanceState(Bundle savedInstanceState) { mItemList = (Map) savedInstanceState.getSerializable(EXTRA_ITEM_LIST); int selectedListSize = getSelectedItemListInternal().size(); - updateToolbarIfNeeded(selectedListSize); - updateMultiChoiceMode(selectedListSize); - processNotifyDataSetChanged(); + refreshMultiChoiceModeState(selectedListSize); } } + /** + * Use this method instead of {@link RecyclerView.Adapter#notifyDataSetChanged()} for + * notifying a change in the data set. + * + * NOTE: The new data will not keep the current selected status, all the item will be reset to INACTIVE. + * + */ + public void notifyAdapterDataSetChanged() { + notifyAdapterDataSetChangedInternal(); + refreshMultiChoiceModeState(getSelectedItemListInternal().size()); + } + //endregion //region Private methods @@ -240,9 +250,7 @@ private void perform(Action action, int position, boolean withCallback, boolean int selectedListSize = getSelectedItemListInternal().size(); - updateToolbarIfNeeded(selectedListSize); - - updateMultiChoiceMode(selectedListSize); + refreshMultiChoiceModeState(selectedListSize); processNotifyDataSetChanged(); @@ -255,19 +263,17 @@ private void perform(Action action, int position, boolean withCallback, boolean } } - private void processNotifyDataSetChanged() { + void processNotifyDataSetChanged() { if (mRecyclerView != null) { notifyDataSetChanged(); } } - private void updateToolbarIfNeeded(int selectedListSize) { + private void refreshMultiChoiceModeState(int selectedListSize) { if ((mIsInMultiChoiceMode || mIsInSingleClickMode || selectedListSize > 0) && mMultiChoiceToolbarHelper != null) { mMultiChoiceToolbarHelper.updateToolbar(selectedListSize); } - } - private void updateMultiChoiceMode(int selectedListSize) { boolean somethingSelected = selectedListSize > 0; if (mIsInMultiChoiceMode != somethingSelected) { mIsInMultiChoiceMode = somethingSelected; @@ -292,8 +298,7 @@ private void performAll(Action action) { mItemList.put(i, state); } - updateToolbarIfNeeded(selectedItems); - updateMultiChoiceMode(selectedItems); + refreshMultiChoiceModeState(selectedItems); processNotifyDataSetChanged(); @@ -306,6 +311,14 @@ private void performAll(Action action) { } } + private void notifyAdapterDataSetChangedInternal() { + mItemList.clear(); + for (int i = 0; i < getItemCount(); i++) { + mItemList.put(i, State.INACTIVE); + } + processNotifyDataSetChanged(); + } + @Override public void onClearButtonPressed() { performAll(Action.DESELECT); @@ -315,9 +328,7 @@ public void onClearButtonPressed() { public void onAttachedToRecyclerView(RecyclerView recyclerView) { mRecyclerView = recyclerView; - for (int i = 0; i < getItemCount(); i++) { - mItemList.put(i, State.INACTIVE); - } + notifyAdapterDataSetChangedInternal(); super.onAttachedToRecyclerView(recyclerView); } diff --git a/library/multichoicerecyclerview/src/main/res/values/strings.xml b/library/multichoicerecyclerview/src/main/res/values/strings.xml deleted file mode 100644 index 53a8eb5..0000000 --- a/library/multichoicerecyclerview/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - MultiChoiceRecyclerView - diff --git a/library/multichoicerecyclerview/src/test/java/com/davidecirillo/multichoicerecyclerview/MultiChoiceAdapterTest.java b/library/multichoicerecyclerview/src/test/java/com/davidecirillo/multichoicerecyclerview/MultiChoiceAdapterTest.java index 4bfee42..fc46d49 100644 --- a/library/multichoicerecyclerview/src/test/java/com/davidecirillo/multichoicerecyclerview/MultiChoiceAdapterTest.java +++ b/library/multichoicerecyclerview/src/test/java/com/davidecirillo/multichoicerecyclerview/MultiChoiceAdapterTest.java @@ -20,7 +20,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -48,7 +48,7 @@ public void setUp() throws Exception { mViewHolder = new TestViewHolder(mMockItemView); - mMultiChoiceAdapter = new TestAdapter(); + mMultiChoiceAdapter = spy(new TestAdapter()); mMultiChoiceAdapter.setItemList(mMockItemList); mMultiChoiceAdapter.setMultiChoiceSelectionListener(mMockMultiChoiceListener); @@ -59,7 +59,7 @@ public void setUp() throws Exception { @After public void tearDown() throws Exception { - + ((TestAdapter) mMultiChoiceAdapter).setItemCountTest(0); } @Test @@ -353,6 +353,39 @@ public void givenThreeItemWhenDeselectAllThenAllDeselected() throws Exception { verify(mMockItemList, times(expectedCount)).put(anyInt(), eq(MultiChoiceAdapter.State.INACTIVE)); } + @Test + public void testWhenNotifyAdapterDataSetChangedThenClear() throws Exception { + // Given + + // When + mMultiChoiceAdapter.notifyAdapterDataSetChanged(); + + // Then + verify(mMockItemList, times(1)).clear(); + } + + @Test + public void testWhenNotifyAdapterDataSetChangedThenItemReset() throws Exception { + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Integer.class); + + // Given + ((TestAdapter) mMultiChoiceAdapter).setItemCountTest(10); + + // When + mMultiChoiceAdapter.notifyAdapterDataSetChanged(); + + // Then + verify(mMockItemList, times(10)).put(argumentCaptor.capture(), eq(MultiChoiceAdapter.State.INACTIVE)); + } + + @Test + public void testWhenNotifyAdapterDataSetChangedThenProcessNotifyDataSetChangedCalled() throws Exception { + mMultiChoiceAdapter.notifyAdapterDataSetChanged(); + + verify(mMultiChoiceAdapter, times(1)).processNotifyDataSetChanged(); + + } + private void addInactiveTestItems(int count) { for (int i = 0; i < count; i++) { mRealItemList.put(i, MultiChoiceAdapter.State.INACTIVE); @@ -368,15 +401,20 @@ private TestViewHolder(View itemView) { private class TestAdapter extends MultiChoiceAdapter { private View.OnClickListener mOnClickListener; + private int mTestItemCount; @Override public TestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } + public void setItemCountTest(int anInt) { + mTestItemCount = anInt; + } + @Override public int getItemCount() { - return 0; + return mTestItemCount; } @Override diff --git a/sample/build.gradle b/sample/build.gradle index 1a6f12f..458eac4 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -3,9 +3,9 @@ apply plugin: 'android-apt' ext { PUBLISH_VERSION = '2.0.0' - SUPPORT_LIBRARY_VERSION = '24.2.1' - BUILD_TOOLS = "23.0.3" - TARGET_SDK = 23 + SUPPORT_LIBRARY_VERSION = '25.3.1' + BUILD_TOOLS = "25.0.0" + TARGET_SDK = 25 } android { @@ -26,7 +26,7 @@ android { } lintOptions { - abortOnError true + abortOnError false disable 'Overdraw','UnusedResources','IconLocation','ContentDescription','AppLinksAutoVerifyError','AppLinksAutoVerifyWarning' } @@ -81,9 +81,6 @@ dependencies { compile "com.android.support:design:${SUPPORT_LIBRARY_VERSION}" compile 'com.jakewharton:butterknife:8.1.0' apt 'com.jakewharton:butterknife-compiler:8.1.0' - // RxAndroid - asynchronous operations - compile 'io.reactivex:rxandroid:1.0.1' - compile 'io.reactivex:rxjava:1.0.14' compile 'com.squareup.picasso:picasso:2.5.2' // Testing-only dependencies testCompile 'junit:junit:4.10' diff --git a/sample/src/androidTest/java/com/davidecirillo/multichoicesample/SampleRefreshDataSetTest.java b/sample/src/androidTest/java/com/davidecirillo/multichoicesample/SampleRefreshDataSetTest.java new file mode 100644 index 0000000..560018d --- /dev/null +++ b/sample/src/androidTest/java/com/davidecirillo/multichoicesample/SampleRefreshDataSetTest.java @@ -0,0 +1,81 @@ +package com.davidecirillo.multichoicesample; + +import android.graphics.drawable.ColorDrawable; +import android.support.test.espresso.contrib.RecyclerViewActions; +import android.support.test.rule.ActivityTestRule; +import android.support.test.runner.AndroidJUnit4; +import android.support.v4.content.ContextCompat; +import android.view.View; +import android.widget.RelativeLayout; + +import com.davidecirillo.multichoicesample.api.BaseMultiChoiceActivityTest; +import com.davidecirillo.multichoicesample.sampleToolbar.SampleToolbarActivity; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.ArrayList; + +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.action.ViewActions.longClick; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.hasDescendant; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static com.davidecirillo.multichoicesample.api.RecyclerViewMatcher.withRecyclerView; + +@RunWith(AndroidJUnit4.class) +public class SampleRefreshDataSetTest extends BaseMultiChoiceActivityTest { + + public SampleToolbarActivity mActivity; + + @Override + protected boolean isSelected(View view) { + RelativeLayout relativeLayout = (RelativeLayout) view.findViewById(R.id.get_started_relative_layout); + + return !(relativeLayout == null || relativeLayout.getBackground() == null) && ((ColorDrawable) relativeLayout.getBackground()).getColor() == ContextCompat.getColor(mActivity, R.color.colorPrimaryDark); + } + + @Rule + public ActivityTestRule mActivityRule = new ActivityTestRule<>(SampleToolbarActivity.class); + + @Before + public void setUp() { + mActivity = mActivityRule.getActivity(); + + wakeScreen(mActivity); + } + + @Test + public void testNotifyAdapterDataSetChangeResetTheItemStateToInactive() throws Exception { + onView(withId(R.id.multiChoiceRecyclerView)) + .perform(RecyclerViewActions.actionOnItemAtPosition(0, longClick())) + .check(matches(isSelected())); + + onView(withId(R.id.multiChoiceRecyclerView)) + .perform(RecyclerViewActions.actionOnItemAtPosition(1, click())) + .check(matches(isSelected())); + + mActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + + ArrayList newData = new ArrayList<>(); + newData.add("data1"); + newData.add("data2"); + + mActivity.getMySampleToolbarAdapter().setThis(newData); + mActivity.getMySampleToolbarAdapter().notifyAdapterDataSetChanged(); + } + }); + + onView(withRecyclerView(R.id.multiChoiceRecyclerView).atPosition(0)) + .check(matches(hasDescendant(withText("data1")))); + + onView(withRecyclerView(R.id.multiChoiceRecyclerView).atPosition(1)) + .check(matches(hasDescendant(withText("data2")))); + } +} diff --git a/sample/src/androidTest/java/com/davidecirillo/multichoicesample/api/RecyclerViewMatcher.java b/sample/src/androidTest/java/com/davidecirillo/multichoicesample/api/RecyclerViewMatcher.java new file mode 100644 index 0000000..4bb25f5 --- /dev/null +++ b/sample/src/androidTest/java/com/davidecirillo/multichoicesample/api/RecyclerViewMatcher.java @@ -0,0 +1,71 @@ +package com.davidecirillo.multichoicesample.api; + +import android.content.res.Resources; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.hamcrest.TypeSafeMatcher; + +public class RecyclerViewMatcher { + private final int recyclerViewId; + + public RecyclerViewMatcher(int recyclerViewId) { + this.recyclerViewId = recyclerViewId; + } + + public static RecyclerViewMatcher withRecyclerView(final int recyclerViewId) { + return new RecyclerViewMatcher(recyclerViewId); + } + + public Matcher atPosition(final int position) { + return atPositionOnView(position, -1); + } + + public Matcher atPositionOnView(final int position, final int targetViewId) { + + return new TypeSafeMatcher() { + Resources resources = null; + View childView; + + public void describeTo(Description description) { + String idDescription = Integer.toString(recyclerViewId); + if (this.resources != null) { + try { + idDescription = this.resources.getResourceName(recyclerViewId); + } catch (Resources.NotFoundException var4) { + idDescription = String.format("%s (resource name not found)", + new Object[] { Integer.valueOf + (recyclerViewId) }); + } + } + + description.appendText("with id: " + idDescription); + } + + public boolean matchesSafely(View view) { + + this.resources = view.getResources(); + + if (childView == null) { + RecyclerView recyclerView = + (RecyclerView) view.getRootView().findViewById(recyclerViewId); + if (recyclerView != null && recyclerView.getId() == recyclerViewId) { + childView = recyclerView.findViewHolderForAdapterPosition(position).itemView; + } + else { + return false; + } + } + + if (targetViewId == -1) { + return view == childView; + } else { + View targetView = childView.findViewById(targetViewId); + return view == targetView; + } + + } + }; + } +} diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 2ca2fb5..3298ca7 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -7,11 +7,13 @@ + android:theme="@style/AppTheme" + tools:ignore="GoogleAppIndexingWarning"> diff --git a/sample/src/main/java/com/davidecirillo/multichoicesample/BaseActivity.java b/sample/src/main/java/com/davidecirillo/multichoicesample/BaseActivity.java index dec49c6..9b4c470 100644 --- a/sample/src/main/java/com/davidecirillo/multichoicesample/BaseActivity.java +++ b/sample/src/main/java/com/davidecirillo/multichoicesample/BaseActivity.java @@ -31,6 +31,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { setToolbar(); } + @SuppressWarnings("RestrictedApi") private void setToolbar() { setSupportActionBar(toolbar); diff --git a/sample/src/main/java/com/davidecirillo/multichoicesample/sampleToolbar/MySampleToolbarAdapter.java b/sample/src/main/java/com/davidecirillo/multichoicesample/sampleToolbar/MySampleToolbarAdapter.java index 79040fb..e4cce13 100644 --- a/sample/src/main/java/com/davidecirillo/multichoicesample/sampleToolbar/MySampleToolbarAdapter.java +++ b/sample/src/main/java/com/davidecirillo/multichoicesample/sampleToolbar/MySampleToolbarAdapter.java @@ -31,13 +31,11 @@ import com.davidecirillo.multichoicesample.R; import java.util.ArrayList; +import java.util.List; -/** - * Created by davidecirillo on 13/03/16. - */ -class MySampleToolbarAdapter extends MultiChoiceAdapter { +public class MySampleToolbarAdapter extends MultiChoiceAdapter { - private final ArrayList mList; + private List mList; private final Context mContext; MySampleToolbarAdapter(ArrayList stringList, Context context) { @@ -50,14 +48,12 @@ public MySampleToolbarViewHolder onCreateViewHolder(ViewGroup parent, int viewTy return new MySampleToolbarViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_sample_toolbar, parent, false)); } - @Override public void onBindViewHolder(MySampleToolbarViewHolder holder, int position) { super.onBindViewHolder(holder, position); holder.mTextView.setText(mList.get(position)); } - /** * Override this method to implement a custom active/deactive state */ @@ -89,4 +85,8 @@ public void onClick(View v) { public int getItemCount() { return mList.size(); } + + public void setThis(final ArrayList newData) { + mList = newData; + } } diff --git a/sample/src/main/java/com/davidecirillo/multichoicesample/sampleToolbar/SampleToolbarActivity.java b/sample/src/main/java/com/davidecirillo/multichoicesample/sampleToolbar/SampleToolbarActivity.java index fac08b5..13d7056 100644 --- a/sample/src/main/java/com/davidecirillo/multichoicesample/sampleToolbar/SampleToolbarActivity.java +++ b/sample/src/main/java/com/davidecirillo/multichoicesample/sampleToolbar/SampleToolbarActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.support.annotation.IntDef; import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -21,6 +22,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Random; import butterknife.BindView; import butterknife.OnClick; @@ -30,9 +32,9 @@ public class SampleToolbarActivity extends BaseActivity { private static final int DEFAULT_QUANTITY_MODE = QuantityMode.STRING; @IntDef({ - QuantityMode.NONE, - QuantityMode.STRING, - QuantityMode.PLURALS, + QuantityMode.NONE, + QuantityMode.STRING, + QuantityMode.PLURALS, }) @Retention(RetentionPolicy.SOURCE) public @interface QuantityMode { @@ -64,6 +66,18 @@ protected int setActivityIdentifier() { return R.layout.activity_sample_toolbar; } + @OnClick(R.id.notify_data_changed) + void notifyDataChanged() { + + stringList.clear(); + Random random = new Random(); + for (int i = 0; i < random.nextInt(30); i++) { + stringList.add("New item " + i); + } + + mMySampleToolbarAdapter.notifyAdapterDataSetChanged(); + } + @OnClick(R.id.result) void result() { @@ -98,13 +112,13 @@ private void setUpMultiChoiceRecyclerView() { stringList = getSampleList(); MultiChoiceToolbar.Builder builder = new MultiChoiceToolbar.Builder(SampleToolbarActivity.this, toolbar) - .setMultiChoiceColours(R.color.colorPrimaryMulti, R.color.colorPrimaryDarkMulti) - .setDefaultIcon(R.drawable.ic_arrow_back_white_24dp, new View.OnClickListener() { - @Override - public void onClick(View view) { - onBackPressed(); - } - }); + .setMultiChoiceColours(R.color.colorPrimaryMulti, R.color.colorPrimaryDarkMulti) + .setDefaultIcon(R.drawable.ic_arrow_back_white_24dp, new View.OnClickListener() { + @Override + public void onClick(View view) { + onBackPressed(); + } + }); switch (quantityMode) { case QuantityMode.NONE: @@ -161,15 +175,15 @@ public boolean onOptionsItemSelected(MenuItem item) { boolean select = mMySampleToolbarAdapter.select(2); if (!select) { Toast.makeText(this, "Item not selected because not in multi choice mode or single click mode, select something first.", - Toast.LENGTH_LONG).show(); + Toast.LENGTH_LONG).show(); } return true; case R.id.single_click_mode: mMySampleToolbarAdapter.setSingleClickMode(!mMySampleToolbarAdapter.isInSingleClickMode()); Toast.makeText(getApplicationContext(), - "Always Single Click Mode [" + mMySampleToolbarAdapter.isInSingleClickMode() + "]", - Toast.LENGTH_SHORT).show(); + "Always Single Click Mode [" + mMySampleToolbarAdapter.isInSingleClickMode() + "]", + Toast.LENGTH_SHORT).show(); return true; @@ -199,10 +213,20 @@ public int getQuantityMode() { return quantityMode; } + @VisibleForTesting + public MySampleToolbarAdapter getMySampleToolbarAdapter() { + return mMySampleToolbarAdapter; + } + public void setQuantityMode(@QuantityMode int quantityMode) { mMySampleToolbarAdapter.deselectAll(); this.quantityMode = quantityMode; setUpMultiChoiceRecyclerView(); } + + public void setStringList(ArrayList list) { + stringList.clear(); + stringList.addAll(list); + } } diff --git a/sample/src/main/res/layout-v23/activity_sample_toolbar.xml b/sample/src/main/res/layout-v23/activity_sample_toolbar.xml index 9ba99be..8dcb9a8 100644 --- a/sample/src/main/res/layout-v23/activity_sample_toolbar.xml +++ b/sample/src/main/res/layout-v23/activity_sample_toolbar.xml @@ -18,6 +18,13 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/selected_items"/> + +