个人中心、图片裁剪、图片上传、收货地址、消息推送、权限管理等功能开发与一键式封装(一)
1.1 个人中心中RecycleView内地址和设置的item实现
逻辑:
在个人中心根类中,1)设置了每个按钮的点击事件以及要跳转的Fragment的逻辑,2)在RecyclerView中添加了两条item,设置了数据,给RecyclerView设置了item的点击的监听事件;在监听事件中根据item的id选择跳转的Fragment。
1、个人中心界面实现
1.1 个人中心中RecycleView内地址和设置的item实现
位于latte-ec模块main->personal->list包下的ListBean。
主要作用:RecycleView内的数据处理,采用构造者模式,传入和保存数据。
public class ListBean implements MultiItemEntity {
private int mItemType = 0;//item的类型
private String mImageUrl = null;//头像
private String mText = null;
private String mValue = null;
private int mId = 0;
private LatteDelegate mDelegate = null;//需要跳转,传入根布局
private CompoundButton.OnCheckedChangeListener mOnCheckedChangeListener = null;//推送设置
public ListBean(int mItemType, String mImageUrl, String mText, String mValue, int mId, LatteDelegate mDelegate, CompoundButton.OnCheckedChangeListener mOnCheckedChangeListener) {
this.mItemType = mItemType;
this.mImageUrl = mImageUrl;
this.mText = mText;
this.mValue = mValue;
this.mId = mId;
this.mDelegate = mDelegate;
this.mOnCheckedChangeListener = mOnCheckedChangeListener;
}
public String getImageUrl() {
return mImageUrl;
}
public String getText() {
if (mText == null) {
return "";
}
return mText;
}
public String getValue() {
if (mValue == null) {
return "";
}
return mValue;
}
public int getId() {
return mId;
}
public LatteDelegate getDelegate() {
return mDelegate;
}
public CompoundButton.OnCheckedChangeListener getmOnCheckedChangeListener() {
return mOnCheckedChangeListener;
}
@Override
public int getItemType() {
return mItemType;
}
public static final class Builder {
private int id = 0;
private int itemType = 0;
private String imageUrl = null;
private String text = null;
private String value = null;
private CompoundButton.OnCheckedChangeListener onCheckedChangeListener = null;
private LatteDelegate delegate = null;
public Builder setId(int id) {
this.id = id;
return this;
}
public Builder setItemType(int itemType) {
this.itemType = itemType;
return this;
}
public Builder setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
return this;
}
public Builder setText(String text) {
this.text = text;
return this;
}
public Builder setValue(String value) {
this.value = value;
return this;
}
public Builder setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener onCheckedChangeListener) {
this.onCheckedChangeListener = onCheckedChangeListener;
return this;
}
public Builder setDelegate(LatteDelegate delegate) {
this.delegate = delegate;
return this;
}
public ListBean build() {
return new ListBean(itemType, imageUrl, text, value, id, delegate, onCheckedChangeListener);
}
}
}
1.2 收货地址和设置的item类型
位于latte-ec模块main->personal->list包下的ListItemType。
主要作用:RecycleView内的数据的item类型。
public class ListItemType {
public static final int ITEM_NORMAL = 20;//数据信息类型
}
1.3 收货地址和设置的item数据适配器
位于latte-ec模块main->personal->list包下的ListItemAdapter。
主要作用:RecycleView内的数据适配器,对ListBean中数据进行转化。
public class ListAdapter extends BaseMultiItemQuickAdapter<ListBean, BaseViewHolder> {
public ListAdapter(List<ListBean> data) {
super(data);
addItemType(ListItemType.ITEM_NORMAL, R.layout.arrow_item_layout);
}
@Override
protected void convert(BaseViewHolder helper, ListBean item) {//转化数据,将设置的数据匹配到view中
switch (helper.getItemViewType()){
case 20:
helper.setText(R.id.tv_arrow_text,item.getText());
helper.setText(R.id.tv_arrow_value,item.getValue());
break;
default:
break;
}
}
}
1.4 个人中心根类
位于latte-ec模块main->personal包下的PersonalDelegate。
主要作用:个人中心根类,传入设置和地址的item数据,通过adapter进行显示。
public class PersonalDelegate extends BottomItemDelegate {
@BindView(R2.id.rv_personal_setting)
RecyclerView mRvSettings = null;
@Override
public Object setLayout() {
return R.layout.delegate_personal;
}
@Override
public void onBindView(@Nullable Bundle savedInstanceState, View rootView) {
final ListBean address = new ListBean.Builder()//为recycleView添加的item
.setItemType(ListItemType.ITEM_NORMAL)
.setId(1)
.setText("收货地址")
.build();
final ListBean system = new ListBean.Builder()
.setItemType(ListItemType.ITEM_NORMAL)
.setId(2)
.setText("系统地址")
.build();
final List<ListBean> data = new ArrayList<>();
data.add(address);
data.add(system);
//设置RecycleView
final LinearLayoutManager manager = new LinearLayoutManager(getContext());
mRvSettings.setLayoutManager(manager);
final ListAdapter adapter = new ListAdapter(data);
mRvSettings.setAdapter(adapter);
}
}
1.5 效果图
红框内为recycleView
2、订单列表逻辑梳理和实现-1
2.1 订单数据转换类
位于latte-ec模块main->personal->list->order包下的OrderListDataConverter。
主要作用:订单中点击事件的list数据转换,将JSON数据保存到ENTITY中。
public class OrderListDataConverter extends DataConverter {
@Override
public ArrayList<MultipleItemEntity> convert() {
final JSONArray array = JSON.parseObject(getJsonData()).getJSONArray("data");
final int size = array.size();
for (int i = 0; i < size; i++) {
final JSONObject data = array.getJSONObject(i);
final String thumb = data.getString("thumb");
final String title = data.getString("title");
final int id = data.getInteger("id");
final double price = data.getDouble("price");
final String time = data.getString("time");
final MultipleItemEntity entity = MultipleItemEntity.builder()
.setItemType(OrderListItemType.ITEM_ORDER_LIST)
.setField(MultipleFields.ID, id)
.setField(MultipleFields.IMAGE_URL, thumb)
.setField(MultipleFields.TITLE, title)
.setField(OrderItemFields.PRICE, price)
.setField(OrderItemFields.TIME, time)
.build();
ENTITIES.add(entity);
}
return ENTITIES;
}
}
2.2 订单数据适配类
位于latte-ec模块main->personal->list->order包下的OrderListAdapter。
主要作用:将从Conterver中存储的ENTITY中,通过key获取值,将值与视图View绑定。
public class OrderListAdapter extends MultipleRecyclerAdapter {
private static final RequestOptions OPTIONS = new RequestOptions()
.diskCacheStrategy(DiskCacheStrategy.ALL)
.centerCrop()
.dontAnimate();
protected OrderListAdapter(List<MultipleItemEntity> data) {
super(data);
addItemType(OrderListItemType.ITEM_ORDER_LIST, R.layout.item_order_list);
}
@SuppressLint("SetTextI18n")
@Override
protected void convert(MultipleViewHolder holder, MultipleItemEntity entity) {
super.convert(holder, entity);
switch (holder.getItemViewType()) {
case OrderListItemType.ITEM_ORDER_LIST:
final AppCompatImageView imageView = holder.getView(R.id.image_order_list);
final AppCompatTextView title = holder.getView(R.id.tv_order_list_title);
final AppCompatTextView price = holder.getView(R.id.tv_order_list_price);
final AppCompatTextView time = holder.getView(R.id.tv_order_list_time);
final String titleVal = entity.getFiled(MultipleFields.TITLE);
final String timeVal = entity.getFiled(OrderItemFields.TIME);
final double priceVal = entity.getFiled(OrderItemFields.PRICE);
final String imageUrl = entity.getFiled(MultipleFields.IMAGE_URL);
Glide.with(mContext)//加载图片
.load(imageUrl)
.apply(OPTIONS)
.into(imageView);
title.setText(titleVal);//视图与JSON数据绑定
price.setText("价格" + String.valueOf(priceVal));
time.setText("时间" + timeVal);
break;
default:
break;
}
}
}
2.3 订单的根类
位于latte-ec模块main->personal->list->order包下的OrderListDelegate。
主要作用:订单点击事件进入的list的根布局。
public class OrderListDelegate extends LatteDelegate {
private String mType = null;//根据不同type设置不同的orderList
@BindView(R2.id.rv_order_list)
RecyclerView mRecyclerView = null;
@Override
public Object setLayout() {
return R.layout.delegate_order_list;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {