仿电商App:笔记(十二):个人中心、图片裁剪、图片上传、收货地址、消息推送、权限管理等功能开发与一键式封装(一)

这篇博客详细介绍了如何开发和封装电商App的个人中心功能,包括个人中心界面实现,订单列表逻辑,个人信息更新,图片处理和权限管理,收货地址管理和消息推送的相关逻辑。重点讲解了界面布局、数据适配、权限处理和图片剪裁的实现过程。
摘要由CSDN通过智能技术生成

个人中心、图片裁剪、图片上传、收货地址、消息推送、权限管理等功能开发与一键式封装(一)

1、个人中心界面实现

1.1 个人中心中RecycleView内地址和设置的item实现

1.2 收货地址和设置的item类型

1.3 收货地址和设置的item数据适配器

1.4 个人中心根类

1.5 效果图

2、订单列表逻辑梳理和实现-1

2.1 订单数据转换类

2.2 订单数据适配类 

2.3 订单的根类

2.4 个人中心根类

2.5 效果图

3、个人信息更新实现-1

3.1 个人信息布局实现

3.2 个人信息界面更改的设置

4、个人信息更新实现-2

4.1 更新生日、性别

4.2 效果图

5、一键式相机,图片处理剪裁和动态权限封装

5.1 照片处理类

5.2 存储照片处理相关值

5.3 请求码存储类

5.4 照片处理类,补充拍照、从相册选择的逻辑

5.5 照相机调用类

5.6 动态权限处理类

5.7 头像的图片剪裁逻辑处理

6、收货地址管理功能实现

6.1 地址管理的入口

6.2 个人中心根类设置地址信息

6.3 效果图

逻辑:

在个人中心根类中,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) {
     
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值