0

我有一個從ArrayAdapter派生的自定義適配器,它將覆蓋getView(),我們將其稱爲CustomObjectAdapter。我手動添加由適配器創建View s到一個LinearLayout中象下面這樣:notifyDataSetChanged()不會在繪製到LinearLayout的適配器上調用getView()

m_adapter = new CustomObjectAdapter(this.getApplicationContext(), 
            R.layout.custom_object_layout, 
            m_customObjectArrayList); 
m_linearLayout = (LinearLayout)findViewById(R.id.custom_object_list_linear_layout); 

for (int i = 0; i < m_adapter.getCount(); i++) { 
    // Create the view for the custom object 
    View view = m_adapter.getView(i, null, null); 
    m_linearLayout.addView(view); 
} 

我填充LinearLayoutView s,而不是使用ListView,因爲我它是包含在Fragment中,我希望整個區域內可滾動 - 而不僅僅是ListView內的區域。我在這個StackOverflow問題中找到了這個解決方案:Using a ListAdapter to fill a LinearLayout inside a ScrollView layout

在這些View s被填充的同一類中,將更新適配器的getView()方法中使用的數據,然後我呼叫m_adapter.notifyDataSetChanged()。然而,getView()函數並未被調用。在代碼的另一個領域,我正在更新一個以相同方式連接到ListView的適配器(而不是LinearLayout),並且它正在更新。有誰知道我做錯了什麼?

+0

替代方案,而不是解決方案,但您可以考慮在['ListView'](http://developer.android.com/reference/android/widget/ListView.html)中的'addHeaderView'和'addFooterView'未來您希望非列表項目也可以滾動。 – blahdiblah

+0

@blahdiblah謝謝 - 我巧合地開始重構我的代碼,就像你在發佈這個問題後立即使用'addHeaderView'方法描述的一樣,現在它完美的工作!如果您將以上評論添加到您的答案中,我會接受它作爲解決方案。 – jokeefe

回答

1

替代方案,而不是解決方案,但您可以使用ListView中的addHeaderViewaddFooterView方法使非列表項也可以滾動。

+0

謝謝!這個解決方案正是我所期待的。我也讚賞你在其他答案中提供的解釋! – jokeefe

1

LinearLayouts不是爲使用適配器而構建的。原因getView未被調用是因爲沒有連接到適配器的視圖來告訴它需要生成新視圖。

在您的代碼中,適配器和視圖之間沒有直接連接,因爲您在ListView上調用setAdapter。就LinearLayout而言,其中的視圖可能來自任何地方。同樣,適配器也不能對其數據集發生更改的消息做任何事情,因爲它沒有連接到任何要求它生成視圖的東西。

視圖使用ListView重新生成,因爲它向適配器註冊DataSetObserver,然後在通過該觀察者通知更改時向適配器請求新視圖。

LinearLayout沒有可比較的機制,所以您唯一真正的選擇是將視圖清空,然後像初始時那樣手動將其放入。

相關問題