云炬Android开发笔记 14 个人中心、图片裁剪、图片上传、收货地址、消息推送、权限管理等功能开发与一键式封装
閱讀目錄
0.優化
1.個人中心頁面的布局
2. 訂單列表邏輯梳理與實現
3. 個人信息的更新實現
3.1 個人信息頁面的布局
3.3 數據的轉化
?5.3?圖片庫中圖片選擇事件的處理
?5.4 相機拍照之后的剪裁
6.圖片上傳和更新邏輯實現
?7.收貨地址管理功能實現
7.1【收貨地址數據的轉化】
7.2【數據適配器的完成】
7.3 收貨地址delegate創建
?7.4 點擊事件的進入
?7.5 刪除鍵功能實現
?8.基于極光推送的消息推送
0.優化
回到頂部
1.個人中心頁面的布局
?
1 <?xml version="1.0" encoding="utf-8"?>2 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"3 android:layout_width="match_parent"4 android:layout_height="match_parent"5 android:background="@color/app_background">6 7 <LinearLayout8 android:layout_width="match_parent"9 android:layout_height="wrap_content"10 android:orientation="vertical">11 12 <!--頭像部分-->13 <RelativeLayout14 android:layout_width="match_parent"15 android:layout_height="160dp"16 android:background="@android:color/holo_orange_dark">17 18 <de.hdodenhof.circleimageview.CircleImageView19 android:id="@+id/img_user_avatar"20 android:layout_width="80dp"21 android:layout_height="80dp"22 android:layout_centerHorizontal="true"23 android:layout_marginTop="30dp"24 android:src="@mipmap/avatar" />25 26 <TextView27 android:layout_width="wrap_content"28 android:layout_height="wrap_content"29 android:layout_alignParentBottom="true"30 android:layout_centerHorizontal="true"31 android:layout_marginBottom="20dp"32 android:text="傅猿猿"33 android:textColor="@android:color/white"34 android:textSize="16sp" />35 36 </RelativeLayout>37 38 <!--訂單部分-->39 <RelativeLayout40 android:layout_width="match_parent"41 android:layout_height="50dp"42 android:background="@android:color/white"43 android:orientation="horizontal"44 android:paddingLeft="10dp"45 android:paddingRight="10dp">46 47 <TextView48 android:layout_width="wrap_content"49 android:layout_height="match_parent"50 android:layout_alignParentLeft="true"51 android:gravity="center"52 android:text="我的訂單"53 android:textColor="@android:color/black" />54 55 <TextView56 android:id="@+id/tv_all_order"57 android:layout_width="wrap_content"58 android:layout_height="match_parent"59 android:layout_toLeftOf="@+id/tv_all_account_arrow"60 android:gravity="center"61 android:text="全部訂單"62 android:textColor="@android:color/darker_gray" />63 64 <com.joanzapata.iconify.widget.IconTextView65 android:id="@+id/tv_all_account_arrow"66 android:layout_width="wrap_content"67 android:layout_height="match_parent"68 android:layout_alignParentEnd="true"69 android:layout_alignParentRight="true"70 android:layout_alignParentTop="true"71 android:layout_marginLeft="10dp"72 android:gravity="center"73 android:text="{fa-chevron-right}"74 android:textColor="@android:color/darker_gray" />75 76 </RelativeLayout>77 78 <LinearLayout79 android:layout_width="match_parent"80 android:layout_height="80dp"81 android:background="@android:color/white"82 android:baselineAligned="true"83 android:orientation="horizontal">84 85 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"86 android:id="@+id/ll_pay"87 android:layout_width="0dp"88 android:layout_height="match_parent"89 android:layout_weight="1"90 android:gravity="center"91 android:orientation="vertical">92 93 <com.joanzapata.iconify.widget.IconTextView94 android:layout_width="30dp"95 android:layout_height="30dp"96 android:layout_gravity="center_horizontal"97 android:gravity="center"98 android:text="{fa-credit-card}"99 android:textSize="20sp" /> 100 101 <TextView 102 android:layout_width="wrap_content" 103 android:layout_height="wrap_content" 104 android:layout_gravity="center_horizontal" 105 android:layout_marginTop="5dp" 106 android:gravity="center" 107 android:text="待付款" 108 android:textSize="10sp" /> 109 110 </LinearLayout> 111 112 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 113 android:id="@+id/ll_receive" 114 android:layout_width="0dp" 115 android:layout_height="match_parent" 116 android:layout_weight="1" 117 android:gravity="center" 118 android:orientation="vertical"> 119 120 <com.joanzapata.iconify.widget.IconTextView 121 android:layout_width="30dp" 122 android:layout_height="30dp" 123 android:layout_gravity="center_horizontal" 124 android:gravity="center" 125 android:text="{fa-truck}" 126 android:textSize="20sp" /> 127 128 <TextView 129 android:id="@+id/textView" 130 android:layout_width="wrap_content" 131 android:layout_height="wrap_content" 132 android:layout_gravity="center_horizontal" 133 android:layout_marginTop="5dp" 134 android:gravity="center" 135 android:text="待收貨" 136 android:textSize="10sp" /> 137 138 </LinearLayout> 139 140 <LinearLayout 141 android:id="@+id/ll_evaluate" 142 android:layout_width="0dp" 143 android:layout_height="match_parent" 144 android:layout_weight="1" 145 android:gravity="center" 146 android:orientation="vertical"> 147 148 <com.joanzapata.iconify.widget.IconTextView 149 android:layout_width="30dp" 150 android:layout_height="30dp" 151 android:layout_gravity="center_horizontal" 152 android:gravity="center" 153 android:text="{fa-clone}" 154 android:textSize="20sp" /> 155 156 <TextView 157 android:layout_width="wrap_content" 158 android:layout_height="wrap_content" 159 android:layout_gravity="center_horizontal" 160 android:layout_marginTop="5dp" 161 android:gravity="center" 162 android:text="待評價" 163 android:textSize="10sp" /> 164 165 </LinearLayout> 166 167 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 168 android:id="@+id/ll_after_market" 169 android:layout_width="0dp" 170 android:layout_height="match_parent" 171 android:layout_weight="1" 172 android:gravity="center" 173 android:orientation="vertical"> 174 175 <com.joanzapata.iconify.widget.IconTextView 176 android:layout_width="30dp" 177 android:layout_height="30dp" 178 android:layout_gravity="center_horizontal" 179 android:gravity="center" 180 android:text="{fa-comments-o}" 181 android:textSize="20sp" /> 182 183 <TextView 184 android:layout_width="wrap_content" 185 android:layout_height="wrap_content" 186 android:layout_gravity="center_horizontal" 187 android:layout_marginTop="5dp" 188 android:gravity="center" 189 android:text="售后" 190 android:textSize="10sp" /> 191 192 </LinearLayout> 193 194 </LinearLayout> 195 196 <android.support.v7.widget.RecyclerView 197 android:id="@+id/rv_personal_setting" 198 android:layout_width="match_parent" 199 android:layout_height="match_parent" 200 android:layout_marginTop="20dp" /> 201 </LinearLayout> 202 203 </ScrollView>?【bean的書寫】使用建造者模式
?
1 package com.flj.latte.ec.main.personal.list;2 3 import android.widget.CompoundButton;4 5 import com.chad.library.adapter.base.entity.MultiItemEntity;6 import com.flj.latte.delegates.LatteDelegate;7 8 9 public class ListBean implements MultiItemEntity {10 11 private int mItemType = 0;12 private String mImageUrl = null; //頭像的地址;13 private String mText = null; //名稱 14 private String mValue = null;15 private int mId = 0;16 private LatteDelegate mDelegate = null;17 // 其中存在checkbox的選擇,需要設置一個listener;18 private CompoundButton.OnCheckedChangeListener mOnCheckedChangeListener = null;19 20 public ListBean(int mItemType, String mImageUrl, String mText, String mValue, int mId, LatteDelegate mDelegate, CompoundButton.OnCheckedChangeListener mOnCheckedChangeListener) {21 this.mItemType = mItemType;22 this.mImageUrl = mImageUrl;23 this.mText = mText;24 this.mValue = mValue;25 this.mId = mId;26 this.mDelegate = mDelegate;27 this.mOnCheckedChangeListener = mOnCheckedChangeListener;28 }29 30 public String getImageUrl() {31 32 return mImageUrl;33 }34 35 public String getText() {36 if (mText == null) {37 return "";38 }39 return mText;40 }41 42 public String getValue() {43 if (mValue == null) {44 return "";45 }46 return mValue;47 }48 49 public int getId() {50 51 return mId;52 }53 54 public LatteDelegate getDelegate() {55 return mDelegate;56 }57 58 public CompoundButton.OnCheckedChangeListener getmOnCheckedChangeListener() {59 return mOnCheckedChangeListener;60 }61 62 @Override63 public int getItemType() {64 return mItemType;65 }66 67 public static final class Builder {68 69 private int id = 0;70 private int itemType = 0;71 private String imageUrl = null;72 private String text = null;73 private String value = null;74 private CompoundButton.OnCheckedChangeListener onCheckedChangeListener = null;75 private LatteDelegate delegate = null;76 77 public Builder setId(int id) {78 this.id = id;79 return this;80 }81 82 public Builder setItemType(int itemType) {83 this.itemType = itemType;84 return this;85 }86 87 public Builder setImageUrl(String imageUrl) {88 this.imageUrl = imageUrl;89 return this;90 }91 92 public Builder setText(String text) {93 this.text = text;94 return this;95 }96 97 public Builder setValue(String value) {98 this.value = value;99 return this; 100 } 101 102 public Builder setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener onCheckedChangeListener) { 103 this.onCheckedChangeListener = onCheckedChangeListener; 104 return this; 105 } 106 107 public Builder setDelegate(LatteDelegate delegate) { 108 this.delegate = delegate; 109 return this; 110 } 111 112 public ListBean build() { 113 return new ListBean(itemType, imageUrl, text, value, id, delegate, onCheckedChangeListener); 114 } 115 } 116 }?【適配器的添加】
?
?【item的幾種布局-1】帶有箭頭的item布局
1 <?xml version="1.0" encoding="utf-8"?>2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"3 android:layout_width="match_parent"4 android:layout_height="50dp"5 android:layout_marginBottom="5dp"6 android:background="@android:color/white">7 8 <android.support.v7.widget.AppCompatTextView9 android:id="@+id/tv_arrow_text" 10 android:layout_width="wrap_content" 11 android:layout_height="match_parent" 12 android:layout_marginLeft="20dp" 13 android:gravity="center" /> 14 15 <android.support.v7.widget.AppCompatTextView 16 android:id="@+id/tv_arrow_value" 17 android:layout_width="wrap_content" 18 android:layout_height="match_parent" 19 android:layout_marginRight="10dp" 20 android:layout_toLeftOf="@+id/icon_arrow" 21 android:gravity="center" 22 android:text="未設置" /> 23 24 <com.joanzapata.iconify.widget.IconTextView 25 android:id="@+id/icon_arrow" 26 android:layout_width="wrap_content" 27 android:layout_height="match_parent" 28 android:layout_alignParentRight="true" 29 android:layout_marginRight="20dp" 30 android:gravity="center" 31 android:text="{fa-chevron-right}" /> 32 33 </RelativeLayout>【設置個人中心的數據】當前寫一些假的數據;
【新建type類】
回到頂部
2. 訂單列表邏輯梳理與實現
?
【數據】根據不同的tag,不同的數據類型, 展示不同的數據;
【數據的轉換】
【適配器的設置】
【orderList的layout】
1 <?xml version="1.0" encoding="utf-8"?>2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"3 xmlns:tools="http://schemas.android.com/tools"4 android:layout_width="match_parent"5 android:layout_height="80dp"6 android:layout_marginBottom="2dp"7 android:background="@android:color/white"8 android:orientation="horizontal">9 10 <FrameLayout 11 android:layout_width="0dp" 12 android:layout_height="match_parent" 13 android:layout_weight="1"> 14 15 <android.support.v7.widget.AppCompatImageView 16 android:id="@+id/image_order_list" 17 android:layout_width="70dp" 18 android:layout_height="70dp" 19 android:layout_gravity="center" 20 tools:ignore="RtlHardcoded" /> 21 </FrameLayout> 22 23 <LinearLayout 24 android:layout_width="0dp" 25 android:layout_height="match_parent" 26 android:layout_weight="2" 27 android:orientation="vertical"> 28 29 <android.support.v7.widget.AppCompatTextView 30 android:id="@+id/tv_order_list_title" 31 android:layout_width="match_parent" 32 android:layout_height="0dp" 33 android:layout_gravity="top" 34 android:layout_weight="1" 35 android:text="Title" 36 tools:ignore="NestedWeights" /> 37 38 <LinearLayout 39 android:layout_width="match_parent" 40 android:layout_height="0dp" 41 android:layout_weight="1" 42 android:orientation="horizontal"> 43 44 <android.support.v7.widget.AppCompatTextView 45 android:id="@+id/tv_order_list_price" 46 android:layout_width="0dp" 47 android:layout_height="match_parent" 48 android:layout_weight="1" 49 android:gravity="left|center" 50 android:text="price" 51 tools:ignore="RtlHardcoded" /> 52 53 <android.support.v7.widget.AppCompatTextView 54 android:id="@+id/tv_order_list_time" 55 android:layout_width="0dp" 56 android:layout_height="match_parent" 57 android:layout_weight="1" 58 android:gravity="left|center" 59 android:text="time" 60 tools:ignore="RtlHardcoded" /> 61 </LinearLayout> 62 </LinearLayout> 63 64 <com.joanzapata.iconify.widget.IconTextView 65 android:layout_width="0dp" 66 android:layout_height="match_parent" 67 android:layout_weight="1" 68 android:gravity="center" 69 android:text="{fa-chevron-right}" 70 android:textSize="18sp" 71 tools:ignore="HardcodedText" /> 72 73 </LinearLayout>?
1 package com.flj.latte.ec.main.personal.order;2 3 import android.annotation.SuppressLint;4 import android.support.v7.widget.AppCompatImageView;5 import android.support.v7.widget.AppCompatTextView;6 7 import com.bumptech.glide.Glide;8 import com.bumptech.glide.load.engine.DiskCacheStrategy;9 import com.bumptech.glide.request.RequestOptions; 10 import com.diabin.latte.ec.R; 11 import com.flj.latte.ui.recycler.MultipleFields; 12 import com.flj.latte.ui.recycler.MultipleItemEntity; 13 import com.flj.latte.ui.recycler.MultipleRecyclerAdapter; 14 import com.flj.latte.ui.recycler.MultipleViewHolder; 15 16 import java.util.List; 17 18 public class OrderListAdapter extends MultipleRecyclerAdapter { 19 20 private static final RequestOptions OPTIONS = new RequestOptions() 21 .diskCacheStrategy(DiskCacheStrategy.ALL) 22 .centerCrop() 23 .dontAnimate(); 24 25 protected OrderListAdapter(List<MultipleItemEntity> data) { 26 super(data); 27 addItemType(OrderListItemType.ITEM_ORDER_LIST, R.layout.item_order_list); 28 } 29 30 @SuppressLint("SetTextI18n") 31 @Override 32 protected void convert(MultipleViewHolder holder, MultipleItemEntity entity) { 33 super.convert(holder, entity); 34 switch (holder.getItemViewType()) { 35 case OrderListItemType.ITEM_ORDER_LIST: 36 final AppCompatImageView imageView = holder.getView(R.id.image_order_list); 37 final AppCompatTextView title = holder.getView(R.id.tv_order_list_title); 38 final AppCompatTextView price = holder.getView(R.id.tv_order_list_price); 39 final AppCompatTextView time = holder.getView(R.id.tv_order_list_time); 40 41 final String titleVal = entity.getField(MultipleFields.TITLE); 42 final String timeVal = entity.getField(OrderItemFields.TIME); 43 final double priceVal = entity.getField(OrderItemFields.PRICE); 44 final String imageUrl = entity.getField(MultipleFields.IMAGE_URL); 45 46 Glide.with(mContext) 47 .load(imageUrl) 48 .apply(OPTIONS) 49 .into(imageView); 50 51 title.setText(titleVal); 52 price.setText("價格:" + String.valueOf(priceVal)); 53 time.setText("時間:" + timeVal); 54 break; 55 default: 56 break; 57 } 58 } 59 }【訂單頁面的布局】
?
【對recycleView數據的填充】
【圖片加載的設置】
?【bug】time的修復
回到頂部
3. 個人信息的更新實現
回到頂部
3.1 個人信息頁面的布局
1 <?xml version="1.0" encoding="utf-8"?>2 <android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"3 android:layout_width="match_parent"4 android:layout_height="match_parent"5 android:background="#f5f5f5"6 android:orientation="vertical">7 8 <android.support.v7.widget.Toolbar9 android:background="@android:color/holo_orange_dark" 10 android:layout_width="match_parent" 11 android:layout_height="wrap_content" /> 12 13 <android.support.v7.widget.RecyclerView 14 android:id="@+id/rv_user_profile" 15 android:layout_width="match_parent" 16 android:layout_height="match_parent" /> 17 18 </android.support.v7.widget.LinearLayoutCompat>?
?
【對于頭像的設置和處理】處理姓名、性別還有頭像的修改等等;
?
?
【頭像事件的綁定】
回到頂部
3.3 數據的轉化
【UI的綁定】
【源碼】com.flj.latte.ec.main.personal.profile.UserProfileDelegate
1 package com.flj.latte.ec.main.personal.profile;2 3 import android.os.Bundle;4 import android.support.annotation.NonNull;5 import android.support.annotation.Nullable;6 import android.support.v7.widget.LinearLayoutManager;7 import android.support.v7.widget.RecyclerView;8 import android.view.View;9 10 import com.diabin.latte.ec.R; 11 import com.diabin.latte.ec.R2; 12 import com.flj.latte.delegates.LatteDelegate; 13 import com.flj.latte.ec.main.personal.list.ListAdapter; 14 import com.flj.latte.ec.main.personal.list.ListBean; 15 import com.flj.latte.ec.main.personal.list.ListItemType; 16 import com.flj.latte.ec.main.personal.settings.NameDelegate; 17 18 import java.util.ArrayList; 19 import java.util.List; 20 21 import butterknife.BindView; 22 23 24 public class UserProfileDelegate extends LatteDelegate { 25 26 @BindView(R2.id.rv_user_profile) 27 RecyclerView mRecyclerView = null; 28 29 @Override 30 public Object setLayout() { 31 return R.layout.delegate_user_profile; 32 } 33 //盡量都使用動態的方式,不要在xml中寫死; 34 @Override 35 public void onBindView(@Nullable Bundle savedInstanceState, @NonNull View rootView) { 36 final ListBean image = new ListBean.Builder() 37 .setItemType(ListItemType.ITEM_AVATAR) 38 .setId(1) 39 .setImageUrl("http://i9.qhimg.com/t017d891ca365ef60b5.jpg") 40 .build(); 41 42 final ListBean name = new ListBean.Builder() 43 .setItemType(ListItemType.ITEM_NORMAL) 44 .setId(2) 45 .setText("姓名") 46 .setDelegate(new NameDelegate()) 47 .setValue("未設置姓名") 48 .build(); 49 50 final ListBean gender = new ListBean.Builder() 51 .setItemType(ListItemType.ITEM_NORMAL) 52 .setId(3) 53 .setText("性別") 54 .setValue("未設置性別") 55 .build(); 56 57 final ListBean birth = new ListBean.Builder() 58 .setItemType(ListItemType.ITEM_NORMAL) 59 .setId(4) 60 .setText("生日") 61 .setValue("未設置生日") 62 .build(); 63 64 final List<ListBean> data = new ArrayList<>(); 65 data.add(image); 66 data.add(name); 67 data.add(gender); 68 data.add(birth); 69 } 70 }回到頂部
?5.3?圖片庫中圖片選擇事件的處理
【請求碼的書寫】
?
【調用類的書寫】
?
【動態權限的處理】
【增加權限】
【調用】
回到頂部
?5.4 相機拍照之后的剪裁
?
?【配置清單】官方提供的;
【增加回調圖片進行剪裁之后并保存】
?
回到頂部
6.圖片上傳和更新邏輯實現
【最后得到的圖像的處理】上傳到服務器并且可以設置本地的頭像;
【設置本地的頭像】
?
【效果】本地的頭像已經發生了改變;
【上傳至服務器】
【剪裁之后進行了服務器的數據上傳】
【說明】對于姓名和性別也是一樣的道理;此處沒有實現
回到頂部
?7.收貨地址管理功能實現
【說明】收貨地址使用的是recyclerView;
回到頂部
7.1【收貨地址數據的轉化】
?
回到頂部
7.2【數據適配器的完成】
?
【item布局】
1 <?xml version="1.0" encoding="utf-8"?>2 <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" //此處使用的cardView3 xmlns:card_view="http://schemas.android.com/apk/res-auto"4 android:layout_width="match_parent"5 android:layout_height="140dp"6 android:layout_gravity="center"7 card_view:cardBackgroundColor="@android:color/white"8 card_view:cardCornerRadius="6dp"9 card_view:cardElevation="3dp" 10 card_view:cardUseCompatPadding="true"> 11 12 <android.support.v7.widget.LinearLayoutCompat 13 android:layout_width="match_parent" 14 android:layout_height="match_parent" 15 android:orientation="vertical"> 16 17 <RelativeLayout 18 android:layout_width="match_parent" 19 android:layout_height="0dp" 20 android:layout_weight="1" 21 android:orientation="horizontal"> 22 23 <android.support.v7.widget.AppCompatTextView 24 android:id="@+id/tv_address_name" 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:layout_alignParentLeft="true" 28 android:layout_centerVertical="true" 29 android:layout_marginLeft="20dp" 30 android:text="姓名" 31 android:textColor="@color/app_main" /> 32 33 <android.support.v7.widget.AppCompatTextView 34 android:id="@+id/tv_address_phone" 35 android:layout_width="wrap_content" 36 android:layout_height="wrap_content" 37 android:layout_centerInParent="true" 38 android:text="電話" 39 android:textColor="@color/we_chat_black" /> 40 41 <android.support.v7.widget.AppCompatTextView 42 android:id="@+id/tv_address_delete" 43 android:layout_width="wrap_content" 44 android:layout_height="wrap_content" 45 android:layout_alignParentRight="true" 46 android:layout_centerVertical="true" 47 android:layout_marginRight="20dp" 48 android:text="刪除" 49 android:textColor="@android:color/darker_gray" /> 50 51 </RelativeLayout> 52 53 <View 54 android:layout_width="match_parent" 55 android:layout_height="1dp" 56 android:layout_marginLeft="10dp" 57 android:layout_marginRight="10dp" 58 android:background="@color/app_background" /> 59 60 <RelativeLayout 61 android:layout_width="match_parent" 62 android:layout_height="0dp" 63 android:layout_weight="2"> 64 65 <android.support.v7.widget.AppCompatTextView 66 android:id="@+id/tv_address_address" 67 android:layout_width="wrap_content" 68 android:layout_height="wrap_content" 69 android:layout_alignParentLeft="true" 70 android:layout_centerVertical="true" 71 android:layout_marginLeft="20dp" 72 android:gravity="center_vertical|left" 73 android:textColor="@color/we_chat_black" 74 android:textSize="18sp" /> 75 76 </RelativeLayout> 77 </android.support.v7.widget.LinearLayoutCompat> 78 </android.support.v7.widget.CardView>?
【完善】
1 package com.flj.latte.ec.main.personal.address;2 3 import android.support.v7.widget.AppCompatTextView;4 import android.view.View;5 6 import com.diabin.latte.ec.R;7 import com.flj.latte.net.RestClient;8 import com.flj.latte.net.callback.ISuccess;9 import com.flj.latte.ui.recycler.MultipleFields; 10 import com.flj.latte.ui.recycler.MultipleItemEntity; 11 import com.flj.latte.ui.recycler.MultipleRecyclerAdapter; 12 import com.flj.latte.ui.recycler.MultipleViewHolder; 13 14 import java.util.List; 15 16 17 public class AddressAdapter extends MultipleRecyclerAdapter { 18 19 protected AddressAdapter(List<MultipleItemEntity> data) { 20 super(data); 21 addItemType(AddressItemType.ITEM_ADDRESS, R.layout.item_address); 22 } 23 24 @Override 25 protected void convert(final MultipleViewHolder holder, MultipleItemEntity entity) { 26 super.convert(holder, entity); 27 switch (holder.getItemViewType()) { 28 case AddressItemType.ITEM_ADDRESS: 29 final String name = entity.getField(MultipleFields.NAME); 30 final String phone = entity.getField(AddressItemFields.PHONE); 31 final String address = entity.getField(AddressItemFields.ADDRESS); 32 final boolean isDefault = entity.getField(MultipleFields.TAG); 33 final int id = entity.getField(MultipleFields.ID); 34 35 final AppCompatTextView nameText = holder.getView(R.id.tv_address_name); 36 final AppCompatTextView phoneText = holder.getView(R.id.tv_address_phone); 37 final AppCompatTextView addressText = holder.getView(R.id.tv_address_address); 38 final AppCompatTextView deleteTextView = holder.getView(R.id.tv_address_delete); 39 deleteTextView.setOnClickListener(new View.OnClickListener() { 40 @Override 41 public void onClick(View v) { 42 RestClient.builder() 43 .url("address.php") 44 .params("id", id) 45 .success(new ISuccess() { 46 @Override 47 public void onSuccess(String response) { 48 remove(holder.getLayoutPosition()); 49 } 50 }) 51 .build() 52 .post(); 53 } 54 }); 55 56 nameText.setText(name); 57 phoneText.setText(phone); 58 addressText.setText(address); 59 break; 60 default: 61 break; 62 } 63 } 64 }?
回到頂部
7.3 收貨地址delegate創建
【布局】
1 <?xml version="1.0" encoding="utf-8"?>2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"3 android:layout_width="match_parent"4 android:layout_height="match_parent"5 android:orientation="vertical">6 7 <android.support.v7.widget.Toolbar8 android:layout_width="match_parent"9 android:layout_height="?attr/actionBarSize" 10 android:background="@android:color/holo_orange_dark"> 11 12 <RelativeLayout 13 android:layout_width="match_parent" 14 android:layout_height="match_parent"> 15 16 <android.support.v7.widget.AppCompatTextView 17 android:layout_width="match_parent" 18 android:layout_height="match_parent" 19 android:layout_centerInParent="true" 20 android:gravity="center" 21 android:text="地址管理" 22 android:textColor="@android:color/white" 23 android:textSize="20sp" /> 24 25 <com.joanzapata.iconify.widget.IconTextView 26 android:id="@+id/icon_address_add" 27 android:layout_width="wrap_content" 28 android:layout_height="match_parent" 29 android:layout_alignParentRight="true" 30 android:layout_marginRight="20dp" 31 android:gravity="center" 32 android:text="{fa-plus-square-o}" 33 android:textColor="@android:color/white" 34 android:textSize="30sp" /> 35 36 </RelativeLayout> 37 38 </android.support.v7.widget.Toolbar> 39 40 <android.support.v7.widget.RecyclerView 41 android:id="@+id/rv_address" 42 android:layout_width="match_parent" 43 android:layout_height="match_parent" /> 44 45 </LinearLayout>?
?
1 package com.flj.latte.ec.main.personal.address;2 import android.os.Bundle;3 import android.support.annotation.NonNull;4 import android.support.annotation.Nullable;5 import android.support.v7.widget.LinearLayoutManager;6 import android.support.v7.widget.RecyclerView;7 import android.view.View;8 import com.diabin.latte.ec.R;9 import com.diabin.latte.ec.R2; 10 import com.flj.latte.delegates.LatteDelegate; 11 import com.flj.latte.net.RestClient; 12 import com.flj.latte.net.callback.ISuccess; 13 import com.flj.latte.ui.recycler.MultipleItemEntity; 14 import com.flj.latte.util.log.LatteLogger; 15 import java.util.List; 16 import butterknife.BindView; 17 18 19 public class AddressDelegate extends LatteDelegate implements ISuccess { 20 21 @BindView(R2.id.rv_address) 22 RecyclerView mRecyclerView = null; 23 24 @Override 25 public Object setLayout() { 26 return R.layout.delegate_address; 27 } 28 29 @Override 30 public void onBindView(@Nullable Bundle savedInstanceState, @NonNull View rootView) { 31 RestClient.builder() 32 .url("address.php") 33 .loader(getContext()) 34 .success(this) 35 .build() 36 .get(); 37 } 38 39 @Override 40 public void onSuccess(String response) { 41 LatteLogger.d("AddressDelegate", response); 42 final LinearLayoutManager manager = new LinearLayoutManager(getContext()); 43 mRecyclerView.setLayoutManager(manager); 44 final List<MultipleItemEntity> data = 45 new AddressDataConverter().setJsonData(response).convert(); 46 final AddressAdapter addressAdapter = new AddressAdapter(data); 47 mRecyclerView.setAdapter(addressAdapter); 48 } 49 }回到頂部
?7.4 點擊事件的進入
?
1 package com.flj.latte.ec.main.personal;2 3 import android.view.View;4 import com.chad.library.adapter.base.BaseQuickAdapter;5 import com.chad.library.adapter.base.listener.SimpleClickListener;6 import com.flj.latte.delegates.LatteDelegate;7 import com.flj.latte.ec.main.personal.list.ListBean;8 9 public class PersonalClickListener extends SimpleClickListener { 10 11 private final LatteDelegate DELEGATE; 12 13 public PersonalClickListener(LatteDelegate delegate) { 14 this.DELEGATE = delegate; 15 } 16 17 @Override 18 public void onItemClick(BaseQuickAdapter adapter, View view, int position) { 19 final ListBean bean = (ListBean) baseQuickAdapter.getData().get(position); 20 int id = bean.getId(); 21 switch (id) { 22 case 1: 23 DELEGATE.getParentDelegate().getSupportDelegate().start(bean.getDelegate()); 24 break; 25 case 2: 26 DELEGATE.getParentDelegate().getSupportDelegate().start(bean.getDelegate()); 27 break; 28 default: 29 break; 30 } 31 } 32 33 @Override 34 public void onItemLongClick(BaseQuickAdapter adapter, View view, int position) { 35 36 } 37 38 @Override 39 public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) { 40 41 } 42 43 @Override 44 public void onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) { 45 46 } 47 }?
回到頂部
?7.5 刪除鍵功能實現
回到頂部
?8.基于極光推送的消息推送
?
?
總結
以上是生活随笔為你收集整理的云炬Android开发笔记 14 个人中心、图片裁剪、图片上传、收货地址、消息推送、权限管理等功能开发与一键式封装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从月薪2300女工到年薪70万谷歌程序员
- 下一篇: 2020年最具“钱途”的编程语言