項目是一個自定義類,其中包含一個標題字符串和一個用於保存複選框狀態的枚舉。交換列表中的項目後自定義列表適配器和ViewHolder模式的問題
private final List<Item> mItems = new ArrayList<Item>();
說我有我的ArrayList 3個項目,我想交換的物品2的3
// Move item down
public void moveDown(int position){
if (position < mItems.size() -1) {
Collections.swap(mItems, position, position + 1);
notifyDataSetChanged();
}
}
我能看到的位置,並在調試mItems,該項目被正確地交換。
接下來,每個ArrayList項目都會調用getView函數。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Item item = mItems.get(position);
View myView = convertView;
if (null == myView)
{
LayoutInflater inflater = LayoutInflater.from(mContext);
myView = inflater.inflate(R.layout.item, parent, false);
ViewHolder viewHolder = new ViewHolder();
viewHolder.title = (TextView) myView.findViewById(R.id.titleView);
viewHolder.statusView = (CheckBox) myView.findViewById(R.id.statusCheckBox);
myView.setTag(viewHolder);
myView.setLongClickable(true);
}
final ViewHolder myHolder = (ViewHolder) myView.getTag() ;
// Display Title in TextView
myHolder.title.setText(item.getTitle());
// Set up Status CheckBox
if (item.getStatus() == Status.NOTDONE)
{
myHolder.statusView.setChecked(false);
}
else
{
myHolder.statusView.setChecked(true);
}
// Must also set up an OnCheckedChangeListener, which is called when the user toggles the status checkbox
myHolder.statusView
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked == true) {
item.setStatus(Status.DONE);
}
else
{
item.setStatus(Status.NOTDONE);
}
}
});
return myView;
}
現在,說在beggining,這些都是項目
項目:1 |標題A |複選框狀態:未選中
貨號:2 |標題B |複選框狀態:未選中
貨號:3 |標題C |複選框狀態:經過
和交換後,我們拿到的這款:
項目:1 |標題A |複選框狀態:未選中
貨號:2 |標題C |複選框狀態:已檢查
產品:3 |標題B |複選框狀態:未選中
的第二次 getView被調用,如複選框狀態被選中,將其稱爲:
myHolder.statusView.setChecked(true);
,但奇怪的部分是:在那之後,我看到一個電話到
myHolder.statusView
.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked == true) {
item.setStatus(Status.DONE);
}
else
{
item.setStatus(Status.NOTDONE);
}
}
});
但項指向所述第三項(標題「B」)和相關的複選框,因此我最終的狀態錯誤地設置了3項來完成
我應該怎麼做才能防止onCheckedChanged聽者獲得呼籲第3項,之後我將它設置爲檢查項目3?提前致謝。
這樣做是否會發生而不使用視圖持有者? – pskink
@pskink不,它只發生在我使用ViewHolder時。如果我拿走了if(null == myView),那麼行爲看起來OK – Lelo
不,你不能刪除「if(null == myView)」,它的視圖重用的目的,只是刪除視圖持有人模式,它的一個神話它提高了性能,但幾乎總是會引入問題 – pskink