2014-01-07 97 views
0

所以我在應用ListView項目上的刪除線時從List對象中填充它時出現這個大問題。如何在填充ListView時刪除ListView項目ListView

private void setListItems() { 
     DatabaseHandler db = new DatabaseHandler(this); 
     List<ToDoTask> taskList = db.getAllTasks(); 

     for (ToDoTask tt : taskList) { 
      this.listAdapter.add(tt.getName()); 
     } 

     this.listAdapter.notifyDataSetChanged(); 
    } 

這部分代碼會填充我的ListView。現在我想,如果

tt.getActive() == 0 

以刪除線,添加到項目,我不知道我可以從我的ListView得到一個TextView項目。我試圖在我的for循環:

TextView textView = (TextView) this.listView.getChildAt(this.listView.getCount() -1); 

但應用程序崩潰。 那沒有崩潰我的應用程序的唯一解決辦法是:

TextView textView = this.listAdapter.getView(this.listView.getCount() -1, null, null) 

,但它實際上並沒有改變在ListView什麼。我認爲這不是引用對象本身。 下面是一些代碼實例化我的變量:

this.listView = (ListView) findViewById(R.id.listViewItem); 
    this.listItems = new ArrayList<String>(); 
    this.listAdapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, this.listItems); 
    this.listView.setAdapter(this.listAdapter); 

回答

2

列表視圖是不負責實例化或修改其包含的觀點的基本狀態。這是適配器的工作。當您滾動ListView時,它會調用適配器方法getView(),並且適配器會將其交給一行(可能是滾動到屏幕外的行中的循環視圖)。

getView()方法中,適配器應該查閱底層數據集並根據需要修改該行 - 這將包括跨越文本或設置行內容的任何可視屬性。

+0

@ user3170934:而且,對於刪除線部分,您需要使用'StrikethroughSpan'來纏繞。 – CommonsWare

+0

@Collin FLynn: 如果我理解正確,我需要輸入TextView tv = this.listAdapter.getView(this.listView.getCount() - 1,null,this.listView)''來獲取TextView元素。是的,這給了我一個TextView對象,但是當我在這個傢伙上設置標誌時,它不會影響listView和listAdapter。我應該告訴listAdapter以某種方式更新給定位置的視圖嗎? – user3170934

+0

@ user3170934是的,您應該告訴適配器更新視圖。一種方法是使用'ViewHolder'模式來獲得優勢。讓適配器在每個'ViewHolder'內爲每行存儲位置int。在你的適配器中寫一個方法,將一行(無論你的行是什麼 - 一些視圖)作爲參數。從行中抓取視圖持有者並檢查int位置以查看它在數據集中的哪個項目。您應該將該狀態作爲適配器內部數據集的一部分,並在'getView'方法內檢查被要求傳遞的視圖的狀態,然後構造它。 –