Skip to content

Commit 243ec7f

Browse files
authored
Merge pull request #2429 from NFLeo/master
Add section multiple combination type and demo
2 parents 64c9c76 + b7610d2 commit 243ec7f

File tree

9 files changed

+515
-3
lines changed

9 files changed

+515
-3
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
android:name=".HomeActivity"
3636
android:launchMode="singleTask"></activity>
3737
<activity android:name=".UpFetchUseActivity" />
38+
<activity android:name=".SectionMultipleItemUseActivity" />
3839
</application>
3940

4041
</manifest>

app/src/main/java/com/chad/baserecyclerviewadapterhelper/HomeActivity.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
* https://github.com/CymChad/BaseRecyclerViewAdapterHelper
1919
*/
2020
public class HomeActivity extends AppCompatActivity {
21-
private static final Class<?>[] ACTIVITY = {AnimationUseActivity.class, ChooseMultipleItemUseTypeActivity.class, HeaderAndFooterUseActivity.class, PullToRefreshUseActivity.class, SectionUseActivity.class, EmptyViewUseActivity.class, ItemDragAndSwipeUseActivity.class, ItemClickActivity.class, ExpandableUseActivity.class, DataBindingUseActivity.class,UpFetchUseActivity.class};
22-
private static final String[] TITLE = {"Animation", "MultipleItem", "Header/Footer", "PullToRefresh", "Section", "EmptyView", "DragAndSwipe", "ItemClick", "ExpandableItem", "DataBinding", "UpFetchData"};
23-
private static final int[] IMG = {R.mipmap.gv_animation, R.mipmap.gv_multipleltem, R.mipmap.gv_header_and_footer, R.mipmap.gv_pulltorefresh, R.mipmap.gv_section, R.mipmap.gv_empty, R.mipmap.gv_drag_and_swipe, R.mipmap.gv_item_click, R.mipmap.gv_expandable, R.mipmap.gv_databinding,R.drawable.gv_up_fetch};
21+
private static final Class<?>[] ACTIVITY = {AnimationUseActivity.class, ChooseMultipleItemUseTypeActivity.class, HeaderAndFooterUseActivity.class, PullToRefreshUseActivity.class, SectionUseActivity.class, EmptyViewUseActivity.class, ItemDragAndSwipeUseActivity.class, ItemClickActivity.class, ExpandableUseActivity.class, DataBindingUseActivity.class,UpFetchUseActivity.class,SectionMultipleItemUseActivity.class};
22+
private static final String[] TITLE = {"Animation", "MultipleItem", "Header/Footer", "PullToRefresh", "Section", "EmptyView", "DragAndSwipe", "ItemClick", "ExpandableItem", "DataBinding", "UpFetchData", "SectionMultipleItem"};
23+
private static final int[] IMG = {R.mipmap.gv_animation, R.mipmap.gv_multipleltem, R.mipmap.gv_header_and_footer, R.mipmap.gv_pulltorefresh, R.mipmap.gv_section, R.mipmap.gv_empty, R.mipmap.gv_drag_and_swipe, R.mipmap.gv_item_click, R.mipmap.gv_expandable, R.mipmap.gv_databinding,R.drawable.gv_up_fetch, R.mipmap.gv_multipleltem};
2424
private ArrayList<HomeItem> mDataList;
2525
private RecyclerView mRecyclerView;
2626

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.chad.baserecyclerviewadapterhelper;
2+
3+
import android.os.Bundle;
4+
import android.support.v7.widget.LinearLayoutManager;
5+
import android.support.v7.widget.RecyclerView;
6+
import android.view.View;
7+
import android.widget.Toast;
8+
9+
import com.chad.baserecyclerviewadapterhelper.adapter.SectionMultipleItemAdapter;
10+
import com.chad.baserecyclerviewadapterhelper.base.BaseActivity;
11+
import com.chad.baserecyclerviewadapterhelper.data.DataServer;
12+
import com.chad.baserecyclerviewadapterhelper.entity.SectionMultipleItem;
13+
import com.chad.library.adapter.base.BaseQuickAdapter;
14+
15+
import java.util.List;
16+
17+
/**
18+
* to get SectionMultipleItem you need follow two things
19+
* 1.create entity which extend SectionMultiEntity
20+
* 2.create adapter which extend BaseSectionMultiItemQuickAdapter
21+
*/
22+
public class SectionMultipleItemUseActivity extends BaseActivity {
23+
private RecyclerView mRecyclerView;
24+
private List<SectionMultipleItem> mData;
25+
26+
@Override
27+
protected void onCreate(Bundle savedInstanceState) {
28+
super.onCreate(savedInstanceState);
29+
setContentView(R.layout.activity_section_uer);
30+
setBackBtn();
31+
setTitle("SectionMultiple Use");
32+
mRecyclerView = (RecyclerView) findViewById(R.id.rv_list);
33+
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
34+
35+
// 1. create entityList which item data extend SectionMultiEntity
36+
mData = DataServer.getSectionMultiData();
37+
38+
// create adapter which extend BaseSectionMultiItemQuickAdapter provide your headerResId
39+
SectionMultipleItemAdapter sectionAdapter = new SectionMultipleItemAdapter(R.layout.def_section_head, mData);
40+
sectionAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
41+
@Override
42+
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
43+
SectionMultipleItem item = (SectionMultipleItem) adapter.getData().get(position);
44+
switch (view.getId()) {
45+
case R.id.card_view:
46+
// 获取主体item相应数据给后期使用
47+
if (item.getVideo() != null) {
48+
Toast.makeText(SectionMultipleItemUseActivity.this, item.getVideo().getName(), Toast.LENGTH_LONG).show();
49+
}
50+
break;
51+
default:
52+
Toast.makeText(SectionMultipleItemUseActivity.this, "OnItemChildClickListener " + position, Toast.LENGTH_LONG).show();
53+
break;
54+
55+
}
56+
}
57+
});
58+
mRecyclerView.setAdapter(sectionAdapter);
59+
}
60+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.chad.baserecyclerviewadapterhelper.adapter;
2+
3+
import com.chad.baserecyclerviewadapterhelper.R;
4+
import com.chad.baserecyclerviewadapterhelper.entity.MultipleItem;
5+
import com.chad.baserecyclerviewadapterhelper.entity.SectionMultipleItem;
6+
import com.chad.library.adapter.base.BaseSectionMultiItemQuickAdapter;
7+
import com.chad.library.adapter.base.BaseViewHolder;
8+
9+
import java.util.List;
10+
11+
/**
12+
* https://github.com/CymChad/BaseRecyclerViewAdapterHelper
13+
*/
14+
public class SectionMultipleItemAdapter extends BaseSectionMultiItemQuickAdapter<SectionMultipleItem, BaseViewHolder> {
15+
/**
16+
* init SectionMultipleItemAdapter
17+
* 1. add your header resource layout
18+
* 2. add some kind of items
19+
*
20+
* @param sectionHeadResId The section head layout id for each item
21+
* @param data A new list is created out of this one to avoid mutable list
22+
*/
23+
public SectionMultipleItemAdapter(int sectionHeadResId, List data) {
24+
super(sectionHeadResId, data);
25+
addItemType(SectionMultipleItem.TEXT, R.layout.item_text_view);
26+
addItemType(SectionMultipleItem.IMG_TEXT, R.layout.item_img_text_view);
27+
}
28+
29+
@Override
30+
protected void convertHead(BaseViewHolder helper, final SectionMultipleItem item) {
31+
// deal with header viewHolder
32+
helper.setText(R.id.header, item.header);
33+
helper.setVisible(R.id.more, item.isMore());
34+
helper.addOnClickListener(R.id.more);
35+
}
36+
37+
@Override
38+
protected void convert(BaseViewHolder helper, SectionMultipleItem item) {
39+
// deal with multiple type items viewHolder
40+
helper.addOnClickListener(R.id.card_view);
41+
switch (helper.getItemViewType()) {
42+
case MultipleItem.TEXT:
43+
helper.setText(R.id.tv, item.getVideo().getName());
44+
break;
45+
case MultipleItem.IMG_TEXT:
46+
switch (helper.getLayoutPosition() % 2) {
47+
case 0:
48+
helper.setImageResource(R.id.iv, R.mipmap.animation_img1);
49+
break;
50+
case 1:
51+
helper.setImageResource(R.id.iv, R.mipmap.animation_img2);
52+
break;
53+
}
54+
break;
55+
}
56+
}
57+
}

app/src/main/java/com/chad/baserecyclerviewadapterhelper/data/DataServer.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.chad.baserecyclerviewadapterhelper.entity.MultipleItem;
55
import com.chad.baserecyclerviewadapterhelper.entity.MySection;
66
import com.chad.baserecyclerviewadapterhelper.entity.NormalMultipleEntity;
7+
import com.chad.baserecyclerviewadapterhelper.entity.SectionMultipleItem;
78
import com.chad.baserecyclerviewadapterhelper.entity.Status;
89
import com.chad.baserecyclerviewadapterhelper.entity.Video;
910

@@ -73,6 +74,34 @@ public static List<MySection> getSampleData() {
7374
return list;
7475
}
7576

77+
public static List<SectionMultipleItem> getSectionMultiData() {
78+
List<SectionMultipleItem> list = new ArrayList<>();
79+
Video video = new Video(HTTPS_AVATARS1_GITHUBUSERCONTENT_COM_LINK, CYM_CHAD);
80+
81+
// add section data
82+
list.add(new SectionMultipleItem(true, "Section 1", true));
83+
// add multiple type item data ---start---
84+
list.add(new SectionMultipleItem(SectionMultipleItem.TEXT, new Video(HTTPS_AVATARS1_GITHUBUSERCONTENT_COM_LINK, "video_id_0")));
85+
list.add(new SectionMultipleItem(SectionMultipleItem.TEXT, new Video(HTTPS_AVATARS1_GITHUBUSERCONTENT_COM_LINK, "video_id_1")));
86+
list.add(new SectionMultipleItem(SectionMultipleItem.IMG_TEXT, new Video(HTTPS_AVATARS1_GITHUBUSERCONTENT_COM_LINK, "video_id_2")));
87+
// ---end---
88+
89+
list.add(new SectionMultipleItem(true, "Section 2", false));
90+
list.add(new SectionMultipleItem(SectionMultipleItem.IMG_TEXT, video));
91+
list.add(new SectionMultipleItem(SectionMultipleItem.IMG_TEXT, video));
92+
list.add(new SectionMultipleItem(SectionMultipleItem.TEXT, video));
93+
list.add(new SectionMultipleItem(SectionMultipleItem.TEXT, video));
94+
list.add(new SectionMultipleItem(true, "Section 3", false));
95+
list.add(new SectionMultipleItem(SectionMultipleItem.IMG_TEXT, video));
96+
list.add(new SectionMultipleItem(true, "Section 4", false));
97+
list.add(new SectionMultipleItem(SectionMultipleItem.TEXT, video));
98+
list.add(new SectionMultipleItem(true, "Section 5", false));
99+
list.add(new SectionMultipleItem(SectionMultipleItem.IMG_TEXT, video));
100+
list.add(new SectionMultipleItem(SectionMultipleItem.IMG_TEXT, video));
101+
list.add(new SectionMultipleItem(SectionMultipleItem.IMG_TEXT, video));
102+
return list;
103+
}
104+
76105
public static List<String> getStrData() {
77106
List<String> list = new ArrayList<>();
78107
for (int i = 0; i < 20; i++) {
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.chad.baserecyclerviewadapterhelper.entity;
2+
3+
import com.chad.library.adapter.base.entity.MultiItemEntity;
4+
import com.chad.library.adapter.base.entity.SectionMultiEntity;
5+
6+
/**
7+
* https://github.com/CymChad/BaseRecyclerViewAdapterHelper
8+
*/
9+
public class SectionMultipleItem extends SectionMultiEntity<Video> implements MultiItemEntity {
10+
11+
public static final int TEXT = 1;
12+
public static final int IMG = 2;
13+
public static final int IMG_TEXT = 3;
14+
private int itemType;
15+
private boolean isMore;
16+
private Video video;
17+
18+
public SectionMultipleItem(boolean isHeader, String header, boolean isMore) {
19+
super(isHeader, header);
20+
this.isMore = isMore;
21+
}
22+
23+
public SectionMultipleItem(int itemType, Video video) {
24+
super(video);
25+
this.video = video;
26+
this.itemType = itemType;
27+
}
28+
29+
public boolean isMore() {
30+
return isMore;
31+
}
32+
33+
public void setMore(boolean more) {
34+
isMore = more;
35+
}
36+
37+
public Video getVideo() {
38+
return video;
39+
}
40+
41+
public void setVideo(Video video) {
42+
this.video = video;
43+
}
44+
45+
@Override
46+
public int getItemType() {
47+
return itemType;
48+
}
49+
}
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
package com.chad.library.adapter.base;
2+
3+
import android.support.annotation.IntRange;
4+
import android.support.annotation.LayoutRes;
5+
import android.util.SparseIntArray;
6+
import android.view.ViewGroup;
7+
8+
import com.chad.library.adapter.base.entity.IExpandable;
9+
import com.chad.library.adapter.base.entity.MultiItemEntity;
10+
import com.chad.library.adapter.base.entity.SectionMultiEntity;
11+
12+
import java.util.List;
13+
14+
/**
15+
* https://github.com/CymChad/BaseRecyclerViewAdapterHelper
16+
*/
17+
public abstract class BaseSectionMultiItemQuickAdapter<T extends SectionMultiEntity, K extends BaseViewHolder> extends BaseQuickAdapter<T, K> {
18+
19+
/**
20+
* layouts indexed with their types
21+
*/
22+
private SparseIntArray layouts;
23+
24+
private static final int DEFAULT_VIEW_TYPE = -0xff;
25+
public static final int TYPE_NOT_FOUND = -404;
26+
27+
protected int mSectionHeadResId;
28+
protected static final int SECTION_HEADER_VIEW = 0x00000444;
29+
30+
/**
31+
* Same as QuickAdapter#QuickAdapter(Context,int) but with
32+
* some initialization data.
33+
*
34+
* @param sectionHeadResId The section head layout id for each item
35+
* @param data A new list is created out of this one to avoid mutable list
36+
*/
37+
public BaseSectionMultiItemQuickAdapter(int sectionHeadResId, List<T> data) {
38+
super(data);
39+
this.mSectionHeadResId = sectionHeadResId;
40+
}
41+
42+
@Override
43+
protected int getDefItemViewType(int position) {
44+
T item = mData.get(position);
45+
46+
if (item != null) {
47+
// check the item type include header or not
48+
return item.isHeader ? SECTION_HEADER_VIEW : item.getItemType();
49+
}
50+
return DEFAULT_VIEW_TYPE;
51+
}
52+
53+
protected void setDefaultViewTypeLayout(@LayoutRes int layoutResId) {
54+
addItemType(DEFAULT_VIEW_TYPE, layoutResId);
55+
}
56+
57+
@Override
58+
protected K onCreateDefViewHolder(ViewGroup parent, int viewType) {
59+
// add this to check viewType of section
60+
if (viewType == SECTION_HEADER_VIEW)
61+
return createBaseViewHolder(getItemView(mSectionHeadResId, parent));
62+
63+
return createBaseViewHolder(parent, getLayoutId(viewType));
64+
}
65+
66+
private int getLayoutId(int viewType) {
67+
return layouts.get(viewType, TYPE_NOT_FOUND);
68+
}
69+
70+
/**
71+
* collect layout types you need
72+
*
73+
* @param type The key of layout type
74+
* @param layoutResId The layoutResId of layout type
75+
*/
76+
protected void addItemType(int type, @LayoutRes int layoutResId) {
77+
if (layouts == null) {
78+
layouts = new SparseIntArray();
79+
}
80+
layouts.put(type, layoutResId);
81+
}
82+
83+
@Override
84+
protected boolean isFixedViewType(int type) {
85+
return super.isFixedViewType(type) || type == SECTION_HEADER_VIEW;
86+
}
87+
88+
@Override
89+
public void onBindViewHolder(K holder, int position) {
90+
switch (holder.getItemViewType()) {
91+
case SECTION_HEADER_VIEW:
92+
setFullSpan(holder);
93+
convertHead(holder, getItem(position - getHeaderLayoutCount()));
94+
break;
95+
default:
96+
super.onBindViewHolder(holder, position);
97+
break;
98+
}
99+
}
100+
101+
protected abstract void convertHead(K helper, T item);
102+
103+
@Override
104+
public void remove(@IntRange(from = 0L) int position) {
105+
if (mData == null || position < 0
106+
|| position >= mData.size()) return;
107+
108+
T entity = mData.get(position);
109+
if (entity instanceof IExpandable) {
110+
removeAllChild((IExpandable) entity, position);
111+
}
112+
removeDataFromParent(entity);
113+
super.remove(position);
114+
}
115+
116+
/**
117+
* 移除父控件时,若父控件处于展开状态,则先移除其所有的子控件
118+
*
119+
* @param parent 父控件实体
120+
* @param parentPosition 父控件位置
121+
*/
122+
protected void removeAllChild(IExpandable parent, int parentPosition) {
123+
if (parent.isExpanded()) {
124+
List<MultiItemEntity> chidChilds = parent.getSubItems();
125+
if (chidChilds == null || chidChilds.size() == 0) return;
126+
127+
int childSize = chidChilds.size();
128+
for (int i = 0; i < childSize; i++) {
129+
remove(parentPosition + 1);
130+
}
131+
}
132+
}
133+
134+
/**
135+
* 移除子控件时,移除父控件实体类中相关子控件数据,避免关闭后再次展开数据重现
136+
*
137+
* @param child 子控件实体
138+
*/
139+
protected void removeDataFromParent(T child) {
140+
int position = getParentPosition(child);
141+
if (position >= 0) {
142+
IExpandable parent = (IExpandable) mData.get(position);
143+
parent.getSubItems().remove(child);
144+
}
145+
}
146+
}
147+
148+

0 commit comments

Comments
 (0)