2015-05-06 52 views
1

項目是一個自定義類,其中包含一個標題字符串和一個用於保存複選框狀態的枚舉。交換列表中的項目後自定義列表適配器和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?提前致謝。

+0

這樣做是否會發生而不使用視圖持有者? – pskink

+0

@pskink不,它只發生在我使用ViewHolder時。如果我拿走了if(null == myView),那麼行爲看起來OK – Lelo

+0

不,你不能刪除「if(null == myView)」,它的視圖重用的目的,只是刪除視圖持有人模式,它的一個神話它提高了性能,但幾乎總是會引入問題 – pskink

回答

0

我結束了交換兩個項目後重建受影響的看法。當應該重新創建視圖時,類變量會告訴getView()函數

0

你可以嘗試創建類的viewholder而不是在getview()

+0

我不確定我是否理解,你能改述嗎? – Lelo

相關問題