Skip to content
This repository was archived by the owner on Jan 2, 2021. It is now read-only.

Commit a37ac2e

Browse files
authored
Behavior change to ItemSection and NestedSection (#90)
OnItemClickListener is added to ItemSection and onSectionExpansionToggled behavior is fixed. Test cases for both changes are updated.
1 parent bbd8091 commit a37ac2e

File tree

9 files changed

+98
-10
lines changed

9 files changed

+98
-10
lines changed

multi-view-adapter/src/main/java/mva2/adapter/ItemSection.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import mva2.adapter.internal.ItemMetaData;
2424
import mva2.adapter.internal.RecyclerItem;
2525
import mva2.adapter.util.Mode;
26+
import mva2.adapter.util.OnItemClickListener;
2627

2728
/**
2829
* Section which displays a single item inside the RecyclerView. For example, ItemSection can be
@@ -34,6 +35,7 @@
3435

3536
@Nullable private M item;
3637
@Nullable private ItemMetaData itemMetaData;
38+
@Nullable private OnItemClickListener<M> onItemClickListener;
3739

3840
/**
3941
* No-arg constructor for ItemSection. This sets the {@link ItemSection#item} as null. This
@@ -94,6 +96,16 @@ public void setItem(@NonNull M item) {
9496
}
9597
}
9698

99+
/**
100+
* Set the listener to get callback when an item is clicked inside the section. To invoke this
101+
* listener, you need to call {@link ItemViewHolder#onItemClick()}
102+
*
103+
* @param onItemClickListener Listener to be set
104+
*/
105+
public void setOnItemClickListener(@Nullable OnItemClickListener<M> onItemClickListener) {
106+
this.onItemClickListener = onItemClickListener;
107+
}
108+
97109
//////////////////////////////////////////////////////////////////////////////////////
98110
/// ------------------------------------------------------------------------------ ///
99111
/// --------------------- CAUTION : INTERNAL METHODS AHEAD --------------------- ///
@@ -102,6 +114,12 @@ public void setItem(@NonNull M item) {
102114
/// ------------------------------------------------------------------------------ ///
103115
//////////////////////////////////////////////////////////////////////////////////////
104116

117+
@Override void onItemClicked(int position) {
118+
if (null != onItemClickListener && position == 0 && getCount() > 0) {
119+
onItemClickListener.onItemClicked(position, item);
120+
}
121+
}
122+
105123
@Override Object getItem(int position) {
106124
return item;
107125
}

multi-view-adapter/src/main/java/mva2/adapter/ItemViewHolder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ public boolean isSectionExpanded() {
104104
* If you set the {@link OnItemClickListener} for your ListSection, call this method to get
105105
* notified.
106106
*/
107-
public void onClick() {
107+
public void onItemClick() {
108108
adapter.onItemClicked(getAdapterPosition());
109109
}
110110

multi-view-adapter/src/main/java/mva2/adapter/ListSection.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -338,8 +338,7 @@ public void setDiffUtil(MvaDiffUtil<M> diffUtil) {
338338

339339
/**
340340
* Set the listener to get callback when an item is clicked inside the section. To invoke this
341-
* listener,
342-
* you need to call {@link ItemViewHolder#onClick()}
341+
* listener, you need to call {@link ItemViewHolder#onItemClick()}
343342
*
344343
* @param itemClickListener Listener to be set
345344
*/

multi-view-adapter/src/main/java/mva2/adapter/NestedSection.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,7 @@ itemPosition < getCount() && itemPosition >= 0 ? getModeToHonor(expansionMode,
258258

259259
@Override int onSectionExpansionToggled(int itemPosition, @NonNull Mode sectionExpansionMode) {
260260
Mode mode = getModeToHonor(sectionExpansionMode, this.sectionExpansionMode);
261-
if (itemPosition < getCount() && itemPosition >= 0) {
262-
onChildSectionExpansionToggled(itemPosition, mode);
263-
}
261+
onChildSectionExpansionToggled(itemPosition, mode);
264262
return itemPosition - getCount();
265263
}
266264

multi-view-adapter/src/main/java/mva2/adapter/Section.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ public void setSpanCount(int spanCount) {
237237
public void showSection() {
238238
if (isSectionHidden) {
239239
isSectionHidden = false;
240+
onDataSetChanged();
240241
onInserted(0, getCount());
241242
}
242243
}

multi-view-adapter/src/main/java/mva2/adapter/util/OnItemClickListener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@
2323
/**
2424
* This interface lets you listen to the click event of the items inside the ListSection or
2525
* ItemSection. You can attach this listener to the section and listen for click events. To pass
26-
* down the click events to this interface call {@link ItemViewHolder#onClick()} method.
26+
* down the click events to this interface call {@link ItemViewHolder#onItemClick()} method.
2727
*
2828
* @param <M> Model used in the {@link ListSection} or {@link ItemSection} where this listener is
2929
* attached.
3030
*
31-
* @see ItemViewHolder#onClick()
31+
* @see ItemViewHolder#onItemClick()
3232
*/
3333
public interface OnItemClickListener<M> {
3434

multi-view-adapter/src/test/java/mva2/adapter/CoreExpansionTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
assertTrue(adapter.isItemExpanded(1));
125125
}
126126

127-
@Test public void selectionModeTest_SectionSingle() {
127+
@Test public void expansionModeTest_SectionSingle() {
128128
adapter.setExpansionMode(Mode.MULTIPLE);
129129
listSection1.setExpansionMode(Mode.SINGLE);
130130
listSection2.setExpansionMode(Mode.SINGLE);
@@ -141,7 +141,7 @@
141141
assertTrue(adapter.isItemExpanded(1));
142142
}
143143

144-
@Test public void selectionModeTest_SectionSingle_1() {
144+
@Test public void expansionModeTest_SectionSingle_1() {
145145
adapter.setExpansionMode(Mode.MULTIPLE);
146146
listSection1.setExpansionMode(Mode.SINGLE);
147147
listSection2.setExpansionMode(Mode.SINGLE);

multi-view-adapter/src/test/java/mva2/adapter/MultiViewAdapterTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,21 @@
1717
package mva2.adapter;
1818

1919
import mva2.adapter.testconfig.CommentBinder;
20+
import mva2.adapter.testconfig.Header;
2021
import mva2.adapter.testconfig.HeaderBinder;
2122
import mva2.adapter.testconfig.TestItem;
2223
import mva2.adapter.testconfig.TestItemBinder;
2324
import mva2.adapter.util.Mode;
25+
import mva2.adapter.util.OnItemClickListener;
2426
import org.junit.Test;
27+
import org.mockito.Mockito;
2528

2629
import static org.junit.Assert.assertEquals;
2730
import static org.junit.Assert.assertFalse;
2831
import static org.junit.Assert.assertTrue;
32+
import static org.mockito.ArgumentMatchers.any;
33+
import static org.mockito.ArgumentMatchers.anyInt;
34+
import static org.mockito.Mockito.times;
2935
import static org.mockito.Mockito.verify;
3036
import static org.mockito.Mockito.when;
3137

@@ -257,4 +263,11 @@ public void getItemViewTypeTest_unRegisterBinders() {
257263
adapter.addSection(new ListSection<>());
258264
assertEquals(adapter.getItemCount(), 0);
259265
}
266+
267+
@Test public void onItemClicked_test() {
268+
OnItemClickListener<Header> listener = Mockito.mock(OnItemClickListener.class);
269+
itemSection1.setOnItemClickListener(listener);
270+
adapter.onItemClicked(0);
271+
verify(listener, times(1)).onItemClicked(anyInt(), any(Header.class));
272+
}
260273
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package mva2.adapter;
2+
3+
import mva2.adapter.util.Mode;
4+
import org.junit.Test;
5+
import org.junit.runner.RunWith;
6+
import org.mockito.junit.MockitoJUnitRunner;
7+
8+
import static junit.framework.Assert.assertEquals;
9+
10+
@RunWith(MockitoJUnitRunner.class) public class SectionExpansionTest extends BaseTest {
11+
12+
@Test public void sectionExpansionModeTest_Single() {
13+
adapter.removeAllSections();
14+
adapter.addSection(itemSection1);
15+
adapter.addSection(listSection1);
16+
adapter.addSection(headerSection1);
17+
adapter.addSection(nestedSection1);
18+
19+
adapter.setSectionExpansionMode(Mode.SINGLE);
20+
21+
adapter.collapseAllSections();
22+
23+
adapter.onSectionExpansionToggled(19);
24+
assertEquals(adapter.getItemCount(), 40);
25+
26+
adapter.onSectionExpansionToggled(19);
27+
assertEquals(adapter.getItemCount(), 31);
28+
29+
adapter.onSectionExpansionToggled(30);
30+
assertEquals(adapter.getItemCount(), 40);
31+
32+
adapter.onSectionExpansionToggled(19);
33+
assertEquals(adapter.getItemCount(), 40);
34+
}
35+
36+
@Test public void sectionExpansionModeTest_Multiple() {
37+
adapter.removeAllSections();
38+
adapter.addSection(itemSection1);
39+
adapter.addSection(listSection1);
40+
adapter.addSection(headerSection1);
41+
adapter.addSection(nestedSection1);
42+
43+
adapter.setSectionExpansionMode(Mode.MULTIPLE);
44+
45+
adapter.collapseAllSections();
46+
47+
adapter.onSectionExpansionToggled(19);
48+
assertEquals(adapter.getItemCount(), 40);
49+
50+
adapter.onSectionExpansionToggled(19);
51+
assertEquals(adapter.getItemCount(), 31);
52+
53+
adapter.onSectionExpansionToggled(30);
54+
assertEquals(adapter.getItemCount(), 40);
55+
56+
adapter.onSectionExpansionToggled(19);
57+
assertEquals(adapter.getItemCount(), 49);
58+
}
59+
}

0 commit comments

Comments
 (0)