1. 概述
這篇文章主要記錄下自己在開發過程中,需要交換list集合中相鄰兩個位置的數據,需求如下:
圖片.png
效果描述如下:
1. 銀行卡列表為listview,數據為list集合;
2. 需要實現點擊向下箭頭交換當前位置數據和下一個位置數據,點擊向上箭頭交換當前位置數據和上一個位置數據;
3. 需要使用ArrayList中的 remove和add 方法實現 上移下移list集合中相鄰兩個位置的數據;
2. 上移思路如下
1. 根據當前位置 curPosition,從itemList集合中獲取到 curPosition 對應的數據 upFirst;
2. 根據上一個位置 curPosition-1,從itemList集合中獲取到 curPosition-1 對應的數據 upSecond;
3. 從 itemList集合中 移除 當前位置 curPosition;
4. 從 itemList集合中 移除 上一個位置 curPosition-1;
5. 實現上移效果:調用add方法,把 upFirst數據添加到 上一個位置 curPosition-1;
6. 實現上移效果:調用add方法,把 upSecond數據添加到 當前位置 curPosition;
7. 此時上移效果代碼已經寫完,需要把 curPosition-1位置 重新設置為當前位置 currentPosition;
8. 調用adapter的 refresh方法,把 上移后重新設置的當前位置 currentPosition 傳遞給 refresh方法,
刷新數據即可;
3. 下移思路如下
1. 根據當前位置 curPosition,從itemList集合中獲取到 curPosition 對應的數據 downFirst;
2. 根據下一個位置 curPosition+1,從itemList集合中獲取到 curPosition+1 對應的數據 downSecond;
3. 從 itemList集合中 移除 當前位置 curPosition+1;
4. 從 itemList集合中 移除 下一個位置 curPosition;
5. 實現下移效果:調用add方法,把 downSecond數據添加到 當前位置 curPosition;
6. 實現下移效果:調用add方法,把 downFirst數據添加到 上一個位置 curPosition+1;
7. 此時下移效果代碼已經寫完,需要把 curPosition+1位置 重新設置為當前位置 currentPosition;
8. 調用adapter的 refresh方法,把 下移后重新設置的當前位置 currentPosition 傳遞給 refresh方法,
刷新數據即可;
3. 上移分析圖
圖片.png
4. 下移分析圖
圖片.png
4. 代碼如下
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/8/21 9:42
* Version 1.0
* Params:
* Description: 默認付款方式
*/
public class DefaultPayStyleActivity extends BaseActivity implements ChangeAdapter.Callback {
private ListView lv;
private ChangeAdapter adapter;
private ArrayList<String> itemList;
private int currentPosition = -1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_default_pay_style);
}
@Override
public void initView() {
lv = (ListView) findViewById(R.id.lv_change);
initDatas() ;
adapter = new ChangeAdapter(this, itemList, this, currentPosition);
lv.setAdapter(adapter);
}
private void initDatas() {
itemList = new ArrayList<String>();
itemList.add("余額寶");
itemList.add("螞蟻花唄");
itemList.add("余額");
itemList.add("工商銀行儲蓄卡(1689)");
itemList.add("花唄分期");
}
/**
* ChangeAdapter中的3個點擊事件
* 1. 整個item點擊事件的處理邏輯
* 2. 向上圖標按鍵點擊事件的處理邏輯
* 3. 向下圖標按鍵點擊事件的處理邏輯
*/
@Override
public void click(View v) {
int curPosition;
int mCurPosition;
switch (v.getId()){
//整個item點擊事件的處理邏輯
case R.id.item:
// 通過getTag(key)方法, 強制類型轉換獲取該item的position,然后調用refresh()方法通知adapter當前position數據更新了,
// 然后adapter就會根據 currentPosition處理向上向下箭頭的顯示與隱藏
mCurPosition = (int) v.getTag(R.id.tag_item_click);
currentPosition = mCurPosition;
adapter.refresh(currentPosition);
break;
//向上圖標按鍵點擊事件的處理邏輯
case R.id.up:
// 調用getTag獲取點擊的position,調換當前位置與上一個位置的數據值,就實現了item上移效果,
// 對于第一個item,不處理上移,然后調用refresh()方法刷新數據即可
curPosition = (int) v.getTag();
if (curPosition != 0) {
String upFirst = itemList.get(curPosition); // 當前item位置對應數據
String upSecond = itemList.get(curPosition - 1); // 上一個位置數據值
itemList.remove(curPosition);
itemList.remove(curPosition - 1);
itemList.add(curPosition - 1, upFirst);
itemList.add(curPosition, upSecond);
currentPosition = curPosition - 1;
adapter.refresh(currentPosition);
}
break;
//向下圖標按鍵點擊事件的處理邏輯
case R.id.down:
// 調用getTag獲取點擊的position,調用當前位置與下一個位置的數據值,就實現item下移效果,
// 對于最后一個item,不處理下移,然后調用refresh()方法刷新數據即可
curPosition = (int) v.getTag();
if (curPosition != itemList.size() - 1) {
String downFirst = itemList.get(curPosition);
String downSecond = itemList.get(curPosition + 1);
itemList.remove(curPosition + 1);
itemList.remove(curPosition);
itemList.add(curPosition, downSecond);
itemList.add(curPosition + 1, downFirst);
currentPosition = curPosition + 1;
adapter.refresh(currentPosition);
}
break;
default:
break;
}
}
}