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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章