基于PopupWindow的Android地址三级选择器

此选择器具可以保存当前选择的三级目录,关闭app再次打开仍是上次选择的。看代码:

package com.zkt.myapplication;

import android.content.Context;
import android.content.SharedPreferences;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
 * 作者: ZKT
 * 描述: 三级划选择器
 **/


public class ThreePicker extends PopupWindow implements AdapterView.OnItemClickListener {
    private Context context;
    private View mPopView;

    private XZQHModel xzqhModel;
    private int[] selcetIds = {-1, -1, -1};//被选中的三级ids

    private ListView OneLv, twoLv, threeLv;
    private ListAdapter oneAdapter;
    private ListAdapter twoAdapter;
    private ListAdapter threeAdapter;

    private List<XZQHModel> oneData = new ArrayList<>();
    private List<XZQHModel> twoData = new ArrayList<>();
    private List<XZQHModel> threeData = new ArrayList<>();

    SelectListener listener;

    public ThreePicker(Context context, XZQHModel model) {
        super(context);
        this.context = context;
        this.xzqhModel = model;
        initView(context);

        setContentView(mPopView);
        setBackgroundDrawable(null);
        setWidth(context.getResources().getDisplayMetrics().widthPixels);
        setHeight(2 * context.getResources().getDisplayMetrics().heightPixels / 3);
    }


    //初始化界面
    private void initView(Context context) {
        LayoutInflater inflater = LayoutInflater.from(context);
        mPopView = inflater.inflate(R.layout.custom_popup_window, null);
        OneLv = (ListView) mPopView.findViewById(R.id.lv_qu);
        twoLv = (ListView) mPopView.findViewById(R.id.lv_ban);
        threeLv = (ListView) mPopView.findViewById(R.id.lv_jwh);
        OneLv.setOnItemClickListener(this);
        twoLv.setOnItemClickListener(this);
        threeLv.setOnItemClickListener(this);
        oneData.clear();
        twoData.clear();
        threeData.clear();
        selcetIds = getXZQHIds(context);
        //若之前选择过行政区划
        initStatus();
        oneData.addAll(xzqhModel.children);
        oneAdapter = new ListAdapter(oneData);
        twoAdapter = new ListAdapter(twoData);
        threeAdapter = new ListAdapter(threeData);
        OneLv.setAdapter(oneAdapter);
        twoLv.setAdapter(twoAdapter);
        threeLv.setAdapter(threeAdapter);
    }

    //刷新页面
    public void refresh() {
        oneAdapter.notifyDataSetChanged();
        twoAdapter.notifyDataSetChanged();
        threeAdapter.notifyDataSetChanged();
    }

    @Override
    public void showAsDropDown(View anchor) {
        refresh();
        super.showAsDropDown(anchor);
    }


    //设置选中回调监听器
    public void setListener(SelectListener onlistener) {
        this.listener = onlistener;
    }


    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        switch (parent.getId()) {
            case R.id.lv_qu:
                if (selcetIds[0] != position) {
                    twoData.clear();
                    threeData.clear();
                    //全部置为未选中在
                    for (int i = 0; i < oneData.size(); i++) {
                        oneData.get(i).isSelceted = false;
                    }
                    //选中点击项
                    oneData.get(position).isSelceted = true;
                    selcetIds[0] = position;
                    if (oneData.get(position).children != null) {
                        twoData.addAll(oneData.get(position).children);
                        //新的乡办全部置为未选中
                        for (int i = 0; i < twoData.size(); i++) {
                            twoData.get(i).isSelceted = false;
                        }
                        selcetIds[1] = -1;
                    }
                    oneAdapter.notifyDataSetChanged();
                    twoAdapter.notifyDataSetChanged();
                    threeAdapter.notifyDataSetChanged();
                }
                break;
            case R.id.lv_ban:
                if (selcetIds[1] != position) {
                    threeData.clear();
                    //全部置为未选中在
                    for (int i = 0; i < twoData.size(); i++) {
                        twoData.get(i).isSelceted = false;
                    }
                    //选中点击项
                    twoData.get(position).isSelceted = true;
                    selcetIds[1] = position;
                    if (twoData.get(position).children != null) {
                        threeData.addAll(twoData.get(position).children);
                        //新的居委会全部置为未选中
                        for (int i = 0; i < threeData.size(); i++) {
                            threeData.get(i).isSelceted = false;
                        }
                        selcetIds[2] = -1;
                    }
                    twoAdapter.notifyDataSetChanged();
                    threeAdapter.notifyDataSetChanged();
                }
                break;
            case R.id.lv_jwh:
                if (selcetIds[2] != position) {
                    //全部置为未选中在
                    for (int i = 0; i < threeData.size(); i++) {
                        threeData.get(i).isSelceted = false;
                    }
                    //选中点击项
                    threeData.get(position).isSelceted = true;
                    selcetIds[2] = position;
                    threeAdapter.notifyDataSetChanged();
                    saveXZQHIds(context, selcetIds);
                    listener.select(threeData.get(position));
                    dismiss();
                }
                break;

        }

    }

    //对三级列表状态进行初始化
    private void initStatus() {
        if (selcetIds[2] >= 0)
            //遍历找到之前选中的区
            for (int i = 0; i < xzqhModel.children.size(); i++) {
                if (i == selcetIds[0]) {
                    xzqhModel.children.get(i).isSelceted = true;
                    if (xzqhModel.children.get(i).children != null) {
                        //添加到banData
                        twoData.addAll(xzqhModel.children.get(i).children);
                        for (int j = 0; j < xzqhModel.children.get(i).children.size(); j++) {
                            if (j == selcetIds[1]) {
                                xzqhModel.children.get(i).children.get(j).isSelceted = true;//乡
                                if (xzqhModel.children.get(i).children.get(j).children != null) {
                                    threeData.addAll(xzqhModel.children.get(i).children.get(j).children);
                                    for (int k = 0; k < xzqhModel.children.get(i).children.get(j).children.size(); k++) {
                                        if (selcetIds[2] == k) {
                                            xzqhModel.children.get(i).children.get(j).children.get(k).isSelceted = true;//居委会
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

    }

    public interface SelectListener {
        void select(XZQHModel model);
    }


    //保存选中的三级ids
    public void saveXZQHIds(Context con, int[] ids) {
        SharedPreferences.Editor editor = con.getSharedPreferences("IDS", Context.MODE_PRIVATE).edit();
        editor.putString("ids", ids[0] + "A" + ids[1] + "A" + ids[2]).apply();
    }

    //获取之前选中的三级ids
    public static int[] getXZQHIds(Context con) {
        SharedPreferences sp = con.getSharedPreferences("IDS", Context.MODE_PRIVATE);
        String objs = sp.getString("ids", "-1A-1A-1");
        String[] s = objs.split("A");
        int[] ids = {-1, -1, -1};
        for (int i = 0; i < s.length; i++) {
            ids[i] = Integer.parseInt(s[i]);
        }
        return ids;
    }


    //listview适配器
    class ListAdapter extends BaseAdapter {
        private List<XZQHModel> list;

        public ListAdapter(List<XZQHModel> list) {
            this.list = list;
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Holder holder = null;
            if (convertView == null) {
                holder = new Holder();
                convertView = LayoutInflater.from(context).inflate(R.layout.adapter_xzqh_list, null);
                holder.tvName = (TextView) convertView.findViewById(R.id.tvAddressName);
                convertView.setTag(holder);
            } else {
                holder = (Holder) convertView.getTag();
            }
            XZQHModel mod = list.get(position);
            holder.tvName.setText(mod.ouname);
            if (mod.isSelceted) {
                holder.tvName.setBackgroundColor(context.getResources().getColor(R.color.gray));
            } else {
                holder.tvName.setBackgroundColor(context.getResources().getColor(R.color.white));
            }
            return convertView;
        }

        class Holder {
            TextView tvName;
        }
    }

}
 
Demo源码:http://download.csdn.net/download/qq_32371277/10232519


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值