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);


  • 31
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值