由于項(xiàng)目需求需要用到這個(gè)功能,通過(guò)兩天的時(shí)間自己弄出來(lái)了,首先我們看一下效果我們選擇參團(tuán)城市的時(shí)候是單選功能,選擇線路玩法的時(shí)候我們進(jìn)行多選功能。

01111.gif
1.首先這是一個(gè)PopupWindow的彈窗布局主要是兩個(gè)listview組合而成這里不多說(shuō),想必大家都知道,這里我只提供思路,具體實(shí)現(xiàn)還是靠自己這樣才能有所進(jìn)步
主要的難點(diǎn)是怎么判斷什么時(shí)候單選什么時(shí)候多選,這里我用到了一個(gè)標(biāo)識(shí),就是切換的時(shí)候傳遞一個(gè)數(shù)據(jù)做判斷就好,也很簡(jiǎn)單,接下來(lái)展示一下重要代碼:
在左邊lietview適配器創(chuàng)建一個(gè)方法setSelectedPosition ()用于判斷點(diǎn)擊的是哪個(gè)item
點(diǎn)擊左邊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();//點(diǎn)擊第一個(gè)進(jìn)行傳遞數(shù)據(jù)type=1
adapter_right.getIds().clear();
adapter_right.CleanCheckBox();
}
}
Log.e("selectedPosition", selectedPosition + "===");
if (selectedPosition == 1) {
adapter_right.Type(); ////點(diǎn)擊第二個(gè)進(jìn)行傳遞數(shù)據(jù)type=2
adapter_right.getIds().clear();
adapter_right.CleanCheckBox();
adapter_right.notifyDataSetChanged();
}
adapter_left.setSelectedPosition(position);
adapter_left.notifyDataSetInvalidated();
}});
下面是右邊的適配器 重要的部分已經(jīng)做了注釋
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中對(duì)應(yīng)位置的布爾值,取其相反值(因?yàn)辄c(diǎn)擊一次我們要改變其狀態(tài)) 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(通過(guò)遍歷HashMap將所有CheckBox對(duì)應(yīng)的布爾值都設(shè)為false)單選操作
if (type == 2) {
for (Integer p : isSelected.keySet()) {
isSelected.put(p, false);
}
}
// 再將當(dāng)前選擇CB的實(shí)際狀態(tài)
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));
}
}
到這里就結(jié)束了,