由于项目需求需要用到这个功能,通过两天的时间自己弄出来了,首先我们看一下效果我们选择参团城市的时候是单选功能,选择线路玩法的时候我们进行多选功能。
1.首先这是一个PopupWindow的弹窗布局主要是两个listview组合而成这里不多说,想必大家都知道,这里我只提供思路,具体实现还是靠自己这样才能有所进步
主要的难点是怎么判断什么时候单选什么时候多选,这里我用到了一个标识,就是切换的时候传递一个数据做判断就好,也很简单,接下来展示一下重要代码:
在左边lietview适配器创建一个方法setSelectedPosition ()用于判断点击的是哪个item
点击左边listview中item
lelf_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String str1[] = cityString1.split(",");
if (selectedPosition == 0) { //
for (int i = 0; i < str1.length; i++) {
list1.add(str1[i]);
adapter_right.notifyDataSetChanged();
adapter_right.Type1();//点击第一个进行传递数据type=1
adapter_right.getIds().clear();
adapter_right.CleanCheckBox();
}
}
Log.e("selectedPosition", selectedPosition + "===");
if (selectedPosition == 1) {
adapter_right.Type(); ////点击第二个进行传递数据type=2
adapter_right.getIds().clear();
adapter_right.CleanCheckBox();
adapter_right.notifyDataSetChanged();
}
adapter_left.setSelectedPosition(position);
adapter_left.notifyDataSetInvalidated();
}});
下面是右边的适配器 重要的部分已经做了注释
public RightAdapter() {
this.mInflater = LayoutInflater.from(MainActivity.this);
isSelected = new HashMap<>();
isSelected_one = new HashMap<>();
beSelectedData_map = new ArrayList<>();
for (int i = 1; i < list1.size(); i++) {
isSelected.put(i, false);
}
isSelected_one.put(0, true);
beSelectedData_map.add(0, list1.get(0));
}
public ArrayList<String> getIds() {
return beSelectedData_map;
}
public void Type() { //接收到的消息
type = 2;
}
public void Type1() { //接收到的消息
type = 1;
}
public void CleanCheckBox() { for (int i = 1; i < list1.size(); i++) {
isSelected.put(i, false);
}
isSelected_one.put(0, true);
beSelectedData_map.add(0, list1.get(0));
}
@Override
public int getCount() {
return list1.size();
}
@Override
public Object getItem(int position) {
return list1.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.rightitem, null);
}
LEFT_TV.setText(list1.get(position));
final int pos = position;
LL_linear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取map中对应位置的布尔值,取其相反值(因为点击一次我们要改变其状态) if (pos != 0) {
isSelected_one.put(0, false);
if (beSelectedData_map.contains(list1.get(0))) {
beSelectedData_map.remove(list1.get(0));
}
boolean isSelect = !isSelected.get(pos);// 先将所有的置为FALSE(通过遍历HashMap将所有CheckBox对应的布尔值都设为false)单选操作
if (type == 2) {
for (Integer p : isSelected.keySet()) {
isSelected.put(p, false);
}
}
// 再将当前选择CB的实际状态
isSelected.put(position, isSelect);
notifyDataSetChanged();
Log.e("====type=====", type + "");
if (type == 2) {
beSelectedData_map.clear(); //单选操作
}
if (isSelect) {
beSelectedData_map.add(list1.get(position));
Log.e("已选城市", list1.get(position));
} else {
if(beSelectedData_map.contains(list1.get(position))) {
beSelectedData_map.remove(list1.get(position));
}
}
到这里就结束了,