Android ListView、GridView中getChildAt返回值不正確的問題

        在使用 LitView 或 GridView 時,我們有時候會需要對視圖進行一些動態的修改顯示的操作,這時候就會用到 getChildAt 方法去

取相應 item 的視圖,getChildAt 需要傳入一個 int 類型的參數,代表要獲取的 item 的位置。

        我當時的需求是對用戶點擊的 item 改變顯示樣式,我在 OnItemClickListener 監聽中重寫了 onItemClick 方法,直接將 

position(絕對位置,adapter 中的第幾項)傳入了 getChildAt ,當列表項很少不需要滾動時很正常。但是當數據項很多,ListView 

可以滾動時,那麼問題來了,滾動後的 getChildAt 獲得的 item 並不是我想要的那個。

        這裏其實是我對 getChildAt 方法運用錯誤了。ListView 對 View 是有一套回收機制的,如果屏幕最多可以顯示 n 個子View,那麼內存中其實只有 n 個 item 對象,當我們在滾動時,當第 (n+1) 個 item 進入可見區域時,其實是在複用第1個View。而 getChildAt 返回的 item 是指可是區域內第 position 個元素。

        所以,這裏我們需要做一些特殊處理,在 ListView 中,還有一個方法 getFirstVisiblePosition ,通過它我們可以獲取當前可見區域中的第一個 item 在 adapter 中的 position ,然後用想要獲取的 item 在 adapter 中的 position 減去第一個可見 item 的 position ,即可獲得在當前可見區域中的相對位置。

// 第一個可見View的位置
int first = listView.getFirstVisiblePosition();
// getChildAt ( int position ) 方法中position指的是當前可見區域的第幾個元素
LinearLayout layout = (LinearLayout) listView.getChildAt(position - first);


發佈了44 篇原創文章 · 獲贊 1386 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章