強制適配器重繪只有特定的項目是否有可能?如何重繪只適配器中的一個視圖
目前如果我想重畫列表,我打電話notifyDataSetChanged()
,它重新遍歷所有數據集並重繪所有元素。如果我確切知道哪些元素已更新,並且只想重新繪製那一個元素,該怎麼辦?
強制適配器重繪只有特定的項目是否有可能?如何重繪只適配器中的一個視圖
目前如果我想重畫列表,我打電話notifyDataSetChanged()
,它重新遍歷所有數據集並重繪所有元素。如果我確切知道哪些元素已更新,並且只想重新繪製那一個元素,該怎麼辦?
沒有這樣的方法,沒有那麼糟糕,因爲沒有整個數據集被重新迭代,並且並非所有元素都被重繪,而只是當前可見的元素。這些通常不是那麼多。
您可以使用Map創建singletone對象。然後把你的對象的每個視圖放到這張地圖上。畢竟,您可以更改此對象,重繪您指定的視圖(您必須知道位置),然後致電notifyDataSetChanged()
。
notifyDataSetChanged()
不適用於重新繪製元素,它用於通知適配器,元素已經以某種方式發生了變化,例如有更多的元素,或者它們的數據是從其他類中設置的等等。當然,ListView
(或其他類),適配器連接到的其他類將重繪元素,因爲適配器被強制告訴他,其數據集已更改。
作爲Yume117評論,重繪你可以調用一個View
的invalidate()
方法(甚至更好postInvalidate()
),
postInvalidate():
導致一個無效通過事件循環在隨後的週期 發生。
public void invalidate()
Added in API level 1
Invalidate the whole view. If the view is visible, onDraw(android.graphics.Canvas) will be called at some point in the future. This must be called from a UI thread. To call from a non-UI thread, call postInvalidate().
你可以叫上一個視圖這些方法在Adapter
的getView()
方法,或來電無效的ListView控件(或其他視圖)本身,它只會重繪可見的元素。
you_view.invalidate()? –
但是,如果它是由適配器生成的,你如何訪問該視圖? –
在調用'invalidate()'之前,您需要更新視圖的值(調用'setText()'等),這通常在適配器中完成。 –