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"/>
+
+
+
+