此选择器具可以保存当前选择的三级目录,关闭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