Android 自定义仿京东地址选择器

public class AddressPickerViewextends RelativeLayout{

// recyclerView 选中Item 的颜色

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

    // recyclerView 未选中Item 的颜色

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

    // 确定字体不可以点击时候的颜色

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

    // 确定字体可以点击时候的颜色

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

    private ContextmContext;

    private int defaultTabCount =3; //tab 的数量

    private TabLayoutmTabLayout; // tabLayout

    private RecyclerViewmRvList; // 显示数据的RecyclerView

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

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

    private StringdefaultDistrict ="区县"; //显示在上面tab中的区县

    private ListmRvData; // 用来在recyclerview显示的数据

    private AddressAdaptermAdapter;  // recyclerview 的adapter

    private YwpAddressBeanmYwpAddressBean; // 总数据

    private YwpAddressBean.AddressItemBeanmSelectProvice; //选中 省份bean

    private YwpAddressBean.AddressItemBeanmSelectCity;//选中 城市bean

    private YwpAddressBean.AddressItemBeanmSelectDistrict;//选中 区县bean

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

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

    private int mSelectDistrictPosition =0;//选中 区县  位置

    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);

        // 初始化默认的本地数据  也提供了方法接收外面数据

        mRvList.post(new Runnable() {

@Override

            public void run() {

initData();

            }

});

    }

/**

    * 初始化数据

    * 拿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();

        }

// 将数据转换为对象

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

        if (mYwpAddressBean !=null) {

mRvData.clear();

            mRvData.addAll(mYwpAddressBean.getProvince());

            mAdapter.notifyDataSetChanged();

        }

}

/**

    * 开放给外部传入数据

    * 暂时就用这个Bean模型,如果数据不一致就需要各自根据数据来生成这个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();

        }

}

//点确定

    private void sure() {

if (mSelectProvice !=null &&

mSelectCity !=null &&

mSelectDistrict !=null) {

//  回调接口

            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();

                    // 滚动到这个位置

                    mRvList.smoothScrollToPosition(mSelectProvicePosition);

break;

                case 1:

// 点到城市的时候要判断有没有选择省份

                    if (mSelectProvice !=null) {

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

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

mRvData.add(itemBean);

                        }

}else {

Toast.makeText(mContext, "请您先选择省份", Toast.LENGTH_SHORT).show();

                    }

mAdapter.notifyDataSetChanged();

                    // 滚动到这个位置

                    mRvList.smoothScrollToPosition(mSelectCityPosition);

break;

                case 2:

// 点到区的时候要判断有没有选择省份与城市

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

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

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

mRvData.add(itemBean);

                        }

}else {

Toast.makeText(mContext, "请您先选择省份与城市", Toast.LENGTH_SHORT).show();

                    }

mAdapter.notifyDataSetChanged();

                    // 滚动到这个位置

                    mRvList.smoothScrollToPosition(mSelectDistrictPosition);

break;

            }

}

@Override

        public void onTabUnselected(TabLayout.Tab tab) {

}

@Override

        public void onTabReselected(TabLayout.Tab tab) {

}

};

    /**

    * 下面显示数据的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);

            // 设置选中效果的颜色

            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;

            }

// 设置点击之后的事件

            holder.mTitle.setOnClickListener(new OnClickListener() {

@Override

                public void onClick(View v) {

// 点击 分类别

                    switch (tabSelectPosition) {

case 0:

mSelectProvice =mRvData.get(position);

                            // 清空后面两个的数据

                            mSelectCity =null;

                            mSelectDistrict =null;

                            mSelectCityPosition =0;

                            mSelectDistrictPosition =0;

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

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

                            // 设置这个对应的标题

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

                            // 跳到下一个选择

                            mTabLayout.getTabAt(1).select();

                            mSelectProvicePosition =position;

break;

                        case 1:

mSelectCity =mRvData.get(position);

                            // 清空后面一个的数据

                            mSelectDistrict =null;

                            mSelectDistrictPosition =0;

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

                            // 设置这个对应的标题

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

                            // 跳到下一个选择

                            mTabLayout.getTabAt(2).select();

                            mSelectCityPosition =position;

break;

                        case 2:

mSelectDistrict =mRvData.get(position);

                            // 没了,选完了,这个时候可以点确定了

                            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);

            }

}

}

/**

    * 点确定回调这个接口

    */

    public interface OnAddressPickerSureListener {

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

    }

public void setOnAddressPickerSure(OnAddressPickerSureListener listener) {

this.mOnAddressPickerSureListener = listener;

    }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容