2012-07-24 65 views
3

我有一個顯示項目列表的ListView。當我點擊某個項目時,我將該項目標記爲在我的數據庫表格中顯示。然後,我使用SimpleCursorAdapter,setViewBinder,setViewValue更新列表。Android - 對任何ListView項目所做的任何更改都會影響到第一個項目

我檢查striked列是否設置爲相應的項目,然後我更新TextView來觸發該項目。

的代碼如下

Cursor c = db.fetchAllNotes(id); 
    startManagingCursor(c); 

    String[] from = new String[] { DatabaseHandler.KEY_LIST }; 
    int[] to = new int[] { R.id.text1 }; 

    SimpleCursorAdapter notes = 
     new SimpleCursorAdapter(this, R.layout.task_row, c, from, to); 

    notes.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 

     public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
      // TODO Auto-generated method stub  
      text = (TextView) view.findViewById (R.id.text1); 
      System.out.println("Item is "+ text.getText().toString()); 
      System.out.println("Item from cursor is " + cursor.getString(2)); 
      System.out.println("Striked value is " + Integer.parseInt(cursor.getString(3))); 
      if(Integer.parseInt(cursor.getString(3)) == 1) 
       text.setPaintFlags(textViewItem.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
      return false; 
     } 
    }); 
    setListAdapter(notes); 

我在做什麼錯?

回答

5

我認爲這是因爲視圖在ListView中被重用。嘗試在視圖不會刪除線復位油漆標誌:

if(Integer.parseInt(cursor.getString(3)) == 1){ 
    textViewItem.setPaintFlags(textViewItem.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG); 
} else { 
    //resed paint flags 
    textViewItem.setPaintFlags(textViewItem.getPaintFlags() & (~ Paint.STRIKE_THRU_TEXT_FLAG)); 
} 

編輯: 我不知道如果我的explatation是corect。當你在ListView上有10個項目時,只有5個可見android創建(inflantes)只有5個視圖。當您滾動列表時,一個新項目將可見,但其中一個將消失,因此會有一個未使用的視圖。 Android會採取未使用的視圖,填充新數據並將其用於新出現的項目。我發現一些更多的信息here

+0

這似乎這樣的伎倆,但我會愛知道爲什麼。當你說視圖在ListView中被重用時,會發生什麼?如果你不能詳細說明,我會從這裏谷歌搜索。非常感謝。 – mystified 2012-07-24 16:24:52

+0

我很高興你想知道更多:)我添加了一些解釋給我的答案。 – Leszek 2012-07-24 16:37:50

相關問題