Android疑难杂症-购物车商品种类和商品列表联动效果

  1. 1. 说明
  2. 2. 效果图
  3. 3. 实体类
  4. 4. 菜单adapter
  5. 5. 菜单点击监听
  6. 6. 菜单adapter
  7. 7. 内容滚动监听
  8. 8. 数据模拟与填充

说明

基于BaseRecyclerViewAdapterHelper

1
compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'

效果图

实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package com.keqiang.gftstore.entity;

import com.chad.library.adapter.base.entity.AbstractExpandableItem;
import com.chad.library.adapter.base.entity.MultiItemEntity;

import java.util.List;

/**
* Created by zhouzhuo810 on 2018/5/15.
*/
public class CateEntity extends AbstractExpandableItem<CateEntity.ContentEntity> implements MultiItemEntity {
private String name;
private boolean choose;
private int index;
private List<ContentEntity> contents;

public int getIndex() {
return index;
}

public void setIndex(int index) {
this.index = index;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public boolean isChoose() {
return choose;
}

public void setChoose(boolean choose) {
this.choose = choose;
}

public List<ContentEntity> getContents() {
return contents;
}

public void setContents(List<ContentEntity> contents) {
this.contents = contents;
}

@Override
public int getLevel() {
return 0;
}

@Override
public int getItemType() {
return 0;
}

public static class ContentEntity implements MultiItemEntity {
private String name;
private String picUrl;
private Float price;
private int count;
private int index;

public int getIndex() {
return index;
}

public void setIndex(int index) {
this.index = index;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getPicUrl() {
return picUrl;
}

public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}

public Float getPrice() {
return price;
}

public void setPrice(Float price) {
this.price = price;
}

public int getCount() {
return count;
}

public void setCount(int count) {
this.count = count;
}

@Override
public int getItemType() {
return 1;
}
}
}

菜单adapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import android.content.Context;
import android.util.TypedValue;
import android.widget.TextView;

import com.keqiang.gftstore.R;
import com.keqiang.gftstore.entity.CateEntity;
import com.zhy.autolayout.utils.AutoUtils;

import java.util.List;

import zhouzhuo810.me.zzandframe.ui.adapter.RvAutoBaseAdapter;

/**
* Created by zhouzhuo810 on 2018/5/15.
*/
public class CateRvAdapter extends RvAutoBaseAdapter<CateEntity> {

public CateRvAdapter(Context context, List<CateEntity> data) {
super(context, data);
}

@Override
protected int getLayoutId(int viewType) {
return R.layout.rv_item_cate;
}

@Override
protected void fillData(ViewHolder holder, CateEntity item, int position) {
holder.setText(R.id.tv_name, item.getName())
.setBackgroundRes(R.id.list_root, item.isChoose() ? R.color.colorWhite : R.color.colorBg)
.setTextColor(R.id.tv_name, item.isChoose() ? 0xff000000 : 0xff888888)
.setGone(R.id.iv_icon, position != 0);
TextView tvName = holder.getView(R.id.tv_name);
if (item.isChoose()) {
tvName.setTextSize(TypedValue.COMPLEX_UNIT_PX, AutoUtils.getPercentWidthSize(41));
tvName.requestLayout();
} else {
tvName.setTextSize(TypedValue.COMPLEX_UNIT_PX, AutoUtils.getPercentWidthSize(36));
tvName.requestLayout();
}
}

public void setSelection(int position) {
if (getData() != null) {
for (CateEntity entity : getData()) {
entity.setChoose(false);
}
getData().get(position).setChoose(true);
notifyDataSetChanged();
}
}
}

菜单点击监听

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cateRvAdapter.setOnItemClickListener(new RvAutoBaseAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
if (cateRvAdapter.getData() != null) {
for (CateEntity entity : cateRvAdapter.getData()) {
entity.setChoose(false);
}
cateRvAdapter.getData().get(position).setChoose(true);
cateRvAdapter.notifyDataSetChanged();

((LinearLayoutManager)rvContent.getLayoutManager()).scrollToPositionWithOffset(contentRvAdapter.getFirstPositionOfGroup(position), 0);
}
}
});

菜单adapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;

import com.chad.library.adapter.base.BaseMultiItemQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.chad.library.adapter.base.entity.MultiItemEntity;
import com.keqiang.gftstore.R;
import com.keqiang.gftstore.entity.CateEntity;
import com.zhy.autolayout.utils.AutoUtils;

import java.util.ArrayList;
import java.util.List;

/**
* Created by zhouzhuo810 on 2018/5/15.
*/

public class ContentRvAdapter extends BaseMultiItemQuickAdapter<MultiItemEntity, BaseViewHolder> {

public ContentRvAdapter(@Nullable List<MultiItemEntity> data) {
super(data);
addItemType(0, R.layout.rv_item_right_title);
addItemType(1, R.layout.rv_item_right_content);
}

@Override
protected BaseViewHolder createBaseViewHolder(ViewGroup parent, int layoutResId) {
BaseViewHolder baseViewHolder = super.createBaseViewHolder(parent, layoutResId);
AutoUtils.auto(baseViewHolder.itemView);
baseViewHolder.setNestView(R.id.iv_dec);
baseViewHolder.setNestView(R.id.iv_add);
return baseViewHolder;
}

@Override
protected void convert(BaseViewHolder helper, MultiItemEntity item) {
switch (helper.getItemViewType()) {
case 0:
CateEntity cate = (CateEntity) item;
helper.setText(R.id.tv_title_name, cate.getName());
break;
case 1:
CateEntity.ContentEntity content = (CateEntity.ContentEntity) item;
helper.setText(R.id.tv_goods_name, content.getName())
.setText(R.id.tv_price, content.getPrice() + "")
.setText(R.id.tv_shop_qty, content.getCount() + "")
.setVisible(R.id.iv_dec, content.getCount() != 0)
.setVisible(R.id.tv_shop_qty, content.getCount() != 0);
break;
}
}

public int getFirstPositionOfGroup(int group) {
if (getData() != null) {
List<MultiItemEntity> data = getData();
for (int i = 0; i < data.size(); i++) {
MultiItemEntity multiItemEntity = data.get(i);
if (multiItemEntity instanceof CateEntity) {
CateEntity cate = (CateEntity) multiItemEntity;
if (cate.getIndex() == group) {
Log.e("TTT", "i=" + i);
return i;
}
}
}
}
return 0;
}

public int getGroupForPosition(int position) {
if (getData() != null) {
MultiItemEntity multiItemEntity = getData().get(position);
if (multiItemEntity instanceof CateEntity.ContentEntity) {
CateEntity.ContentEntity content = (CateEntity.ContentEntity) multiItemEntity;
return content.getIndex();
} else {
CateEntity cate = (CateEntity) multiItemEntity;
return cate.getIndex();
}
}
return 0;
}

public float countMoney() {
float count = 0f;
for (MultiItemEntity multiItemEntity : getData()) {
if (multiItemEntity instanceof CateEntity.ContentEntity) {
CateEntity.ContentEntity content = (CateEntity.ContentEntity) multiItemEntity;
float v = content.getCount() * content.getPrice();
count += v;
}
}
return count;
}

public int getCount() {
int count = 0;
for (MultiItemEntity multiItemEntity : getData()) {
if (multiItemEntity instanceof CateEntity.ContentEntity) {
CateEntity.ContentEntity content = (CateEntity.ContentEntity) multiItemEntity;
int v = content.getCount();
count += v;
}
}
return count;
}

public List<CateEntity.ContentEntity> getCarShop() {
List<CateEntity.ContentEntity> list = new ArrayList<>();
for (MultiItemEntity multiItemEntity : getData()) {
if (multiItemEntity instanceof CateEntity.ContentEntity) {
CateEntity.ContentEntity content = (CateEntity.ContentEntity) multiItemEntity;
int v = content.getCount();
if (v > 0) {
list.add(content);
}
}
}
return list;
}
}

内容滚动监听

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rvContent.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) rvContent.getLayoutManager();
int firstVisibleItemPosition=linearLayoutManager.findFirstVisibleItemPosition();//可见范围内的第一项的位置
int lastVisibleItemPosition=linearLayoutManager.findLastVisibleItemPosition();//可见范围内的最后一项的位置
int itemCount=linearLayoutManager.getItemCount();//recyclerview中的item的所有的数目

if (firstVisibleItemPosition > 0) {
int group = contentRvAdapter.getGroupForPosition(firstVisibleItemPosition);
cateRvAdapter.setSelection(group);
}
}
});

数据模拟与填充

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
//关闭闪烁动画
((SimpleItemAnimator) rvContent.getItemAnimator()).setSupportsChangeAnimations(false);
((SimpleItemAnimator) rvShopCar.getItemAnimator()).setSupportsChangeAnimations(false);

String[] names = {
"我的最爱",
"饼干",
"饮料",
"方便面",
"水果"
};

String[] shops = {
"可口可乐330ml",
"Dole都乐菲律宾高地蕉",
"奥利奥夹心饼干",
"可口可乐330ml",
"Dole都乐菲律宾高地蕉",
"奥利奥夹心饼干",
"可口可乐330ml",
"Dole都乐菲律宾高地蕉"
};

List<CateEntity> cates = new ArrayList<>();
for (int i = 0; i < names.length; i++) {
CateEntity entity = new CateEntity();
entity.setName(names[i]);
entity.setChoose(i == 0);
cates.add(entity);
List<CateEntity.ContentEntity> contents = new ArrayList<>();
for (int i1 = 0; i1 < shops.length; i1++) {
CateEntity.ContentEntity contentEntity = new CateEntity.ContentEntity();
contentEntity.setName(shops[i1]);
contentEntity.setPrice(4f);
contents.add(contentEntity);
}
entity.setContents(contents);
}
cateRvAdapter.updateAll(cates);

List<MultiItemEntity> list = new ArrayList<>();
for (int i = 0; i < cates.size(); i++) {
CateEntity entity = cates.get(i);
//设置GroupPosition
entity.setIndex(i);
//这个必须加!!!,不然刷新数据会重复添加。
if (entity.getSubItems() != null) {
entity.getSubItems().clear();
}
if (entity.getContents() != null) {
for (CateEntity.ContentEntity contentEntity : entity.getContents()) {
//设置GroupPosition
contentEntity.setIndex(i);
entity.addSubItem(contentEntity);
}
}
list.add(entity);
}
contentRvAdapter.setNewData(list);
for (int i = 0; i < cates.size(); i++) {
//注意!!!,这里如果adapter添加了n个header则i+n。
contentRvAdapter.collapse(i + 1);
}
contentRvAdapter.expandAll();