
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;
? ? }