Android 自定義仿京東地址選擇器

public class AddressPickerViewextends RelativeLayout{

// recyclerView 選中Item 的顏色

? ? private int defaultSelectedColor = Color.parseColor("#3D71FF");

? ? // recyclerView 未選中Item 的顏色

? ? private int defaultUnSelectedColor = Color.parseColor("#2c2c2c");

? ? // 確定字體不可以點(diǎn)擊時(shí)候的顏色

? ? private int defaultSureUnClickColor = Color.parseColor("#7F7F7F");

? ? // 確定字體可以點(diǎn)擊時(shí)候的顏色

? ? private int defaultSureCanClickColor = Color.parseColor("#3D71FF");

? ? private ContextmContext;

? ? private int defaultTabCount =3; //tab 的數(shù)量

? ? private TabLayoutmTabLayout; // tabLayout

? ? private RecyclerViewmRvList; // 顯示數(shù)據(jù)的RecyclerView

? ? private StringdefaultProvince ="省份"; //顯示在上面tab中的省份

? ? private StringdefaultCity ="城市"; //顯示在上面tab中的城市

? ? private StringdefaultDistrict ="區(qū)縣"; //顯示在上面tab中的區(qū)縣

? ? private ListmRvData; // 用來在recyclerview顯示的數(shù)據(jù)

? ? private AddressAdaptermAdapter;? // recyclerview 的adapter

? ? private YwpAddressBeanmYwpAddressBean; // 總數(shù)據(jù)

? ? private YwpAddressBean.AddressItemBeanmSelectProvice; //選中 省份bean

? ? private YwpAddressBean.AddressItemBeanmSelectCity;//選中 城市bean

? ? private YwpAddressBean.AddressItemBeanmSelectDistrict;//選中 區(qū)縣bean

? ? private int mSelectProvicePosition =0; //選中 省份 位置

? ? private int mSelectCityPosition =0;//選中 城市? 位置

? ? private int mSelectDistrictPosition =0;//選中 區(qū)縣? 位置

? ? private OnAddressPickerSureListenermOnAddressPickerSureListener;

? ? public AddressPickerView(Context context) {

super(context);

? ? ? ? init(context);

? ? }

public AddressPickerView(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

? ? ? ? init(context);

? ? }

public AddressPickerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

? ? ? ? init(context);

? ? }

/**

? ? * 初始化

? ? */

? ? private void init(Context context) {

mContext = context;

? ? ? ? mRvData =new ArrayList<>();

? ? ? ? // UI

? ? ? ? View rootView =inflate(mContext, R.layout.address_picker_view, this);

? ? ? ? // tablayout初始化

? ? ? ? mTabLayout = (TabLayout) rootView.findViewById(R.id.tlTabLayout);

? ? ? ? mTabLayout.addTab(mTabLayout.newTab().setText(defaultProvince));

? ? ? ? mTabLayout.addTab(mTabLayout.newTab().setText(defaultCity));

? ? ? ? mTabLayout.addTab(mTabLayout.newTab().setText(defaultDistrict));

? ? ? ? mTabLayout.addOnTabSelectedListener(tabSelectedListener);

? ? ? ? // recyclerview adapter的綁定

? ? ? ? mRvList = (RecyclerView) rootView.findViewById(R.id.rvList);

? ? ? ? mRvList.setLayoutManager(new LinearLayoutManager(context));

? ? ? ? mAdapter =new AddressAdapter();

? ? ? ? mRvList.setAdapter(mAdapter);

? ? ? ? // 初始化默認(rèn)的本地?cái)?shù)據(jù)? 也提供了方法接收外面數(shù)據(jù)

? ? ? ? mRvList.post(new Runnable() {

@Override

? ? ? ? ? ? public void run() {

initData();

? ? ? ? ? ? }

});

? ? }

/**

? ? * 初始化數(shù)據(jù)

? ? * 拿assets下的json文件

? ? */

? ? private void initData() {

StringBuilder jsonSB =new StringBuilder();

? ? ? ? try {

BufferedReader addressJsonStream =new BufferedReader(new InputStreamReader(mContext.getAssets().open("address.json")));

? ? ? ? ? ? String line;

? ? ? ? ? ? while ((line = addressJsonStream.readLine()) !=null) {

jsonSB.append(line);

? ? ? ? ? ? }

}catch (IOException e) {

e.printStackTrace();

? ? ? ? }

// 將數(shù)據(jù)轉(zhuǎn)換為對(duì)象

? ? ? ? mYwpAddressBean =new Gson().fromJson(jsonSB.toString(), YwpAddressBean.class);

? ? ? ? if (mYwpAddressBean !=null) {

mRvData.clear();

? ? ? ? ? ? mRvData.addAll(mYwpAddressBean.getProvince());

? ? ? ? ? ? mAdapter.notifyDataSetChanged();

? ? ? ? }

}

/**

? ? * 開放給外部傳入數(shù)據(jù)

? ? * 暫時(shí)就用這個(gè)Bean模型,如果數(shù)據(jù)不一致就需要各自根據(jù)數(shù)據(jù)來生成這個(gè)bean了

? ? */

? ? public void initData(YwpAddressBean bean) {

if (bean !=null) {

mSelectDistrict =null;

? ? ? ? ? ? mSelectCity =null;

? ? ? ? ? ? mSelectProvice =null;

? ? ? ? ? ? mTabLayout.getTabAt(0).select();

? ? ? ? ? ? mYwpAddressBean = bean;

? ? ? ? ? ? mRvData.clear();

? ? ? ? ? ? mRvData.addAll(mYwpAddressBean.getProvince());

? ? ? ? ? ? mAdapter.notifyDataSetChanged();

? ? ? ? }

}

//點(diǎn)確定

? ? private void sure() {

if (mSelectProvice !=null &&

mSelectCity !=null &&

mSelectDistrict !=null) {

//? 回調(diào)接口

? ? ? ? ? ? if (mOnAddressPickerSureListener !=null) {

mOnAddressPickerSureListener.onSureClick(mSelectProvice.getN(), mSelectCity.getN(), mSelectDistrict.getN());

? ? ? ? ? ? }

}else {

Toast.makeText(mContext, "地址還沒有選完整哦", Toast.LENGTH_SHORT).show();

? ? ? ? }

}

@Override

? ? protected void onDetachedFromWindow() {

super.onDetachedFromWindow();

? ? ? // mYwpAddressBean = null;

? ? }

/**

? ? * TabLayout 切換事件

? ? */

? ? TabLayout.OnTabSelectedListenertabSelectedListener =new TabLayout.OnTabSelectedListener() {

@Override

? ? ? ? public void onTabSelected(TabLayout.Tab tab) {

mRvData.clear();

? ? ? ? ? ? switch (tab.getPosition()) {

case 0:

mRvData.addAll(mYwpAddressBean.getProvince());

? ? ? ? ? ? ? ? ? ? mAdapter.notifyDataSetChanged();

? ? ? ? ? ? ? ? ? ? // 滾動(dòng)到這個(gè)位置

? ? ? ? ? ? ? ? ? ? mRvList.smoothScrollToPosition(mSelectProvicePosition);

break;

? ? ? ? ? ? ? ? case 1:

// 點(diǎn)到城市的時(shí)候要判斷有沒有選擇省份

? ? ? ? ? ? ? ? ? ? if (mSelectProvice !=null) {

for (YwpAddressBean.AddressItemBean itemBean :mYwpAddressBean.getCity()) {

if (itemBean.getP().equals(mSelectProvice.getI()))

mRvData.add(itemBean);

? ? ? ? ? ? ? ? ? ? ? ? }

}else {

Toast.makeText(mContext, "請(qǐng)您先選擇省份", Toast.LENGTH_SHORT).show();

? ? ? ? ? ? ? ? ? ? }

mAdapter.notifyDataSetChanged();

? ? ? ? ? ? ? ? ? ? // 滾動(dòng)到這個(gè)位置

? ? ? ? ? ? ? ? ? ? mRvList.smoothScrollToPosition(mSelectCityPosition);

break;

? ? ? ? ? ? ? ? case 2:

// 點(diǎn)到區(qū)的時(shí)候要判斷有沒有選擇省份與城市

? ? ? ? ? ? ? ? ? ? if (mSelectProvice !=null &&mSelectCity !=null) {

for (YwpAddressBean.AddressItemBean itemBean :mYwpAddressBean.getDistrict()) {

if (itemBean.getP().equals(mSelectCity.getI()))

mRvData.add(itemBean);

? ? ? ? ? ? ? ? ? ? ? ? }

}else {

Toast.makeText(mContext, "請(qǐng)您先選擇省份與城市", Toast.LENGTH_SHORT).show();

? ? ? ? ? ? ? ? ? ? }

mAdapter.notifyDataSetChanged();

? ? ? ? ? ? ? ? ? ? // 滾動(dòng)到這個(gè)位置

? ? ? ? ? ? ? ? ? ? mRvList.smoothScrollToPosition(mSelectDistrictPosition);

break;

? ? ? ? ? ? }

}

@Override

? ? ? ? public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

? ? ? ? public void onTabReselected(TabLayout.Tab tab) {

}

};

? ? /**

? ? * 下面顯示數(shù)據(jù)的adapter

*/

? ? class AddressAdapterextends RecyclerView.Adapter {

@Override

? ? ? ? public ViewHolderonCreateViewHolder(ViewGroup parent, int viewType) {

return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_address_text, parent, false));

? ? ? ? }

@Override

? ? ? ? public void onBindViewHolder(final ViewHolder holder, final int position) {

final int tabSelectPosition =mTabLayout.getSelectedTabPosition();

? ? ? ? ? ? holder.mTitle.setText(mRvData.get(position).getN());

? ? ? ? ? ? holder.mTitle.setTextColor(defaultUnSelectedColor);

? ? ? ? ? ? // 設(shè)置選中效果的顏色

? ? ? ? ? ? switch (tabSelectPosition) {

case 0:

if (mRvData.get(position) !=null &&

mSelectProvice !=null &&

mRvData.get(position).getI().equals(mSelectProvice.getI())) {

holder.mTitle.setTextColor(defaultSelectedColor);

? ? ? ? ? ? ? ? ? ? }

break;

? ? ? ? ? ? ? ? case 1:

if (mRvData.get(position) !=null &&

mSelectCity !=null &&

mRvData.get(position).getI().equals(mSelectCity.getI())) {

holder.mTitle.setTextColor(defaultSelectedColor);

? ? ? ? ? ? ? ? ? ? }

break;

? ? ? ? ? ? ? ? case 2:

if (mRvData.get(position) !=null &&

mSelectDistrict !=null &&

mRvData.get(position).getI().equals(mSelectDistrict.getI())) {

holder.mTitle.setTextColor(defaultSelectedColor);

? ? ? ? ? ? ? ? ? ? }

break;

? ? ? ? ? ? }

// 設(shè)置點(diǎn)擊之后的事件

? ? ? ? ? ? holder.mTitle.setOnClickListener(new OnClickListener() {

@Override

? ? ? ? ? ? ? ? public void onClick(View v) {

// 點(diǎn)擊 分類別

? ? ? ? ? ? ? ? ? ? switch (tabSelectPosition) {

case 0:

mSelectProvice =mRvData.get(position);

? ? ? ? ? ? ? ? ? ? ? ? ? ? // 清空后面兩個(gè)的數(shù)據(jù)

? ? ? ? ? ? ? ? ? ? ? ? ? ? mSelectCity =null;

? ? ? ? ? ? ? ? ? ? ? ? ? ? mSelectDistrict =null;

? ? ? ? ? ? ? ? ? ? ? ? ? ? mSelectCityPosition =0;

? ? ? ? ? ? ? ? ? ? ? ? ? ? mSelectDistrictPosition =0;

? ? ? ? ? ? ? ? ? ? ? ? ? ? mTabLayout.getTabAt(1).setText(defaultCity);

? ? ? ? ? ? ? ? ? ? ? ? ? ? mTabLayout.getTabAt(2).setText(defaultDistrict);

? ? ? ? ? ? ? ? ? ? ? ? ? ? // 設(shè)置這個(gè)對(duì)應(yīng)的標(biāo)題

? ? ? ? ? ? ? ? ? ? ? ? ? ? mTabLayout.getTabAt(0).setText(mSelectProvice.getN());

? ? ? ? ? ? ? ? ? ? ? ? ? ? // 跳到下一個(gè)選擇

? ? ? ? ? ? ? ? ? ? ? ? ? ? mTabLayout.getTabAt(1).select();

? ? ? ? ? ? ? ? ? ? ? ? ? ? mSelectProvicePosition =position;

break;

? ? ? ? ? ? ? ? ? ? ? ? case 1:

mSelectCity =mRvData.get(position);

? ? ? ? ? ? ? ? ? ? ? ? ? ? // 清空后面一個(gè)的數(shù)據(jù)

? ? ? ? ? ? ? ? ? ? ? ? ? ? mSelectDistrict =null;

? ? ? ? ? ? ? ? ? ? ? ? ? ? mSelectDistrictPosition =0;

? ? ? ? ? ? ? ? ? ? ? ? ? ? mTabLayout.getTabAt(2).setText(defaultDistrict);

? ? ? ? ? ? ? ? ? ? ? ? ? ? // 設(shè)置這個(gè)對(duì)應(yīng)的標(biāo)題

? ? ? ? ? ? ? ? ? ? ? ? ? ? mTabLayout.getTabAt(1).setText(mSelectCity.getN());

? ? ? ? ? ? ? ? ? ? ? ? ? ? // 跳到下一個(gè)選擇

? ? ? ? ? ? ? ? ? ? ? ? ? ? mTabLayout.getTabAt(2).select();

? ? ? ? ? ? ? ? ? ? ? ? ? ? mSelectCityPosition =position;

break;

? ? ? ? ? ? ? ? ? ? ? ? case 2:

mSelectDistrict =mRvData.get(position);

? ? ? ? ? ? ? ? ? ? ? ? ? ? // 沒了,選完了,這個(gè)時(shí)候可以點(diǎn)確定了

? ? ? ? ? ? ? ? ? ? ? ? ? ? mTabLayout.getTabAt(2).setText(mSelectDistrict.getN());

? ? ? ? ? ? ? ? ? ? ? ? ? ? notifyDataSetChanged();

? ? ? ? ? ? ? ? ? ? ? ? ? ? mSelectDistrictPosition =position;

? ? ? ? ? ? ? ? ? ? ? ? ? ? sure();

break;

? ? ? ? ? ? ? ? ? ? }

}

});

? ? ? ? }

@Override

? ? ? ? public int getItemCount() {

return mRvData.size();

? ? ? ? }

class ViewHolderextends RecyclerView.ViewHolder {

TextViewmTitle;

? ? ? ? ? ? ViewHolder(View itemView) {

super(itemView);

? ? ? ? ? ? ? ? mTitle = (TextView) itemView.findViewById(R.id.itemTvTitle);

? ? ? ? ? ? }

}

}

/**

? ? * 點(diǎn)確定回調(diào)這個(gè)接口

? ? */

? ? public interface OnAddressPickerSureListener {

void onSureClick(String proviceName,String cityName,String earaName);

? ? }

public void setOnAddressPickerSure(OnAddressPickerSureListener listener) {

this.mOnAddressPickerSureListener = listener;

? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容