本文为原创作品,转载请标明出处:https://blog.csdn.net/wjj1996825/article/details/80433143

需求分析:在项目中有时候我们用RecyclerView的时候会有需要获取指定位置的itemview在屏幕中的绝对坐标,比如说做一个商品列表点击商品item后启动商品加入购物车动画,或者星座生肖项目中,用户选择出生日期后,自动匹配对应的生肖并启动一个生肖列表view的选中动画,都需要获取到RecyclerView中一个itemview在屏幕中的绝对坐标然后作为动画的起始位置进行启动,动画的结束位置就是你的购物车或者显示选中生肖的button或者view在屏幕中的绝对坐标,当然今天要讨论的主题是这个动画的起始位置,也就是获取RecyclerView指定位置的itemview在屏幕中的绝对坐标。
我总结的有两种方案:
第一种方案(针对点击item进行操作类型):是点击其中一个item的时候,通过自定义RecyclerView的item点击监听把你想要的坐标数组回传过来,这样是运用观察者模式,对点击的item进行观察,点击的时候调用回调方法,返回数组坐标,Activity中通过adapter.setOnItemClick()方法拿到回调的参数,进行动画启动操作,这样得到的坐标数组是正确的,就是无论你点击哪一个item,得到的都是这个itemview在屏幕中的绝对坐标,下面贴下关键代码 (注意我这里贴的是cotlin的代码,用java的同学复制的话需要改动才能使用):

// MyAdapter代码

class MyAdapter(private var con: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
var itemclickListener : OnItemClickListener? = nulloverride fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder.itemView.setOnClickListener {if (itemclickListener!=null){val startLocation = IntArray(2)holder.choose_zodiac_img.getLocationOnScreen(startLocation)//获取点击星座控件的位置itemclickListener!!.onItemClick(position,startLocation)               }}
}fun setOnItemClickListener(listener: OnItemClickListener) {this.itemclickListener = listener}interface OnItemClickListener{abstract fun onItemClick(position: Int, startLocation : IntArray)}}

然后在Activity或者fragment中调用就可以

myAdapter?.setOnItemClickListener(object : MyAdapter.OnItemClickListener{override fun onItemClick(position: Int, startLocation: IntArray) {              begAddShopAnim(view, startLocation)                         }})

第二种方案(针对非点击item进行操作类型)
先对这种需求进行一番解释,非点击item进行操作类型举个例子讲,就比如生肖或者星座项目中,当你不知道你的星座的时候,你可以点击生日选择出生年月日,当用户点击日期选择框的ok
按钮后,你需要做的事情就是根据用户的出生日期自动配对他或她的星座,如果产品经理要求页面展现一个星座列表的对应动画,你就需要获取这个星座对应的item在RecyclerView中的绝对坐标了,这时候就不能用上面的方案靠点击一个item的时候动态获取坐标了,我曾经做过一个尝试,在adapter种创建一个map对象和十二个星座的名字list,把十二个星座的名字作为key,然后在bandviewohlder的时候,把每一个holder的对应绑定的每一个星座数据的名字作为key,这个holder中的你想获取的view的坐标为value存起来:

var startLocation = IntArray(2)holder.itemView.getLocationOnScreen(startLocation)zodiacLocationMap!![zodiacLists[position].zodiacName] = startLocation

然后从fragment根据用户选择出生日期后算出的星座名字,然后从adapter中的map中根据获取星座名称,获取到我们存在map中的这个RecyclerView中对应的星座item的数组对象,然而思路很好,结果却令人失望,无论取哪个item获取到的数组坐标都是一样的,最后实在解决不了只好放弃这个方案了
正确的解决方案应该是这样的其实:
先讲思路:RecyclerView有findViewHolderForAdapterPosition(int postion)方法,可以获取指定位置的holder对象,然后你转型成你自己的holder对象,就可以获取你想获取的item中某个view 的坐标了,然后就可以进行正确位置的动画开始位置启动加载

var holder =  view!!.compatibility_recycle_view.findViewHolderForAdapterPosition(costionIndex) as YourRecyclerViewItmeHolder// 创建一个存放坐标的数组对象var startLocation = IntArray(2)// 从holder对应的itemview中获取此itemview在屏幕中的坐标信息holder.itemView.getLocationOnScreen(startLocation)// 拿到单个itemview在屏幕中的坐标信息后就可以不用担心动画开始的坐标不对而难堪,可以放心的开始动画的操作了begAddShopAnim(view, startLocation)  

其实就是换了一种思路绕了个弯儿回到第一种解决方案的思路解决了,哈哈,这里只讲思路,动画的代码就不贴了,这样的动画代码网上太多了,有问题或者更好思路的欢迎在博客留言一起讨论探讨哦~

RecyclerView中获取item在屏幕中的绝对坐标相关推荐

  1. jsp中获取不到servlet中的ArrayList

    jsp中获取不到servlet中的ArrayList 错误原因: 因为servlet尽管将请求转发(重定向)到其他页面,但是仍会执行完请求转发后面的代码.jsp也是servlet所以也遵循这个原则! ...

  2. java获取鼠标在屏幕中的位置 方法一_Java如何获取鼠标指针的位置?

    MouseInfo 提供获取有关鼠标信息的方法,例如鼠标指针的位置和鼠标按钮的数量.package org.nhooo.example.awt; import java.awt.*; public c ...

  3. VS2010中获取并调用CRM2011中的工作流

    接触过CRM2011的同学们肯定考虑过这样的一个问题,就是我们CRM系统中的那些实体能否通过外部开发工具,比如VS2010来获取呢?更深一步的说,我们能否获取Workflow实体的所有数据,然后在VS ...

  4. java 拦截器响应中取所有参数,spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  5. android 6.0 log,android 6.0 logcat机制(二)logcat从logd中获取log保存到文件中

    一.设置保存log文件的路径 在手机刚开机的时候,会有类似如下命令执行 /system/bin/logcat -r 5120 -v threadtime -v usec -v printable -n ...

  6. android 6.0 logcat机制(二)logcat从logd中获取log保存到文件中

    这篇博客分析的是logcat是如何获取logd中的log,然后写入文件. 一.设置保存log文件的路径 在手机刚开机的时候,会有类似如下命令执行 /system/bin/logcat -r 5120 ...

  7. 在java中获取当前时间_JAVA中获取当前系统时间

    一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...

  8. 拦截器获取请求参数post_spring boot拦截器中获取request post请求中的参数

    最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取 ...

  9. Word控件Spire.Doc 【文本】教程(12) ;新方法在 C# 中获取 Word 文档中内容控件的别名、标签和 ID

    内容控件为您提供了一种设计文档的方法.当您向文档添加内容控件时,该控件由边框.标题和临时文本标识,这些文本可以向用户提供说明,并且可以防止用户编辑或删除文档的受保护部分. 将文档或模板的部分内容绑定到 ...

最新文章

  1. AMF3通讯协议实例
  2. 线程创建后,立刻调用CloseHandle的原因
  3. Diango博客--6.Markdown 文章自动生成目录
  4. c++ 协程_用yield实现协程
  5. 交换机连接控制器_DELL MD3200I存储单双控制器的自由切换
  6. 利用tar 通过网络拷贝数据
  7. mysql 分区 mycat 分片_Mysql系列六:(Mycat分片路由原理、Mycat常用分片规则及对应源码介绍)...
  8. python 包的使用 (四)——Seaborn绘图
  9. mysql 网页_mysql网页客户端工具
  10. php微信h5支付对接流程,微信H5支付接口开发的流程与常见问题
  11. pyecharts导出矢量图
  12. The Active Side of Stereopsis: Fixation Strategy and Adaptation to Natural Environments
  13. 解决 Chrome 浏览器地址栏字体发虚模糊
  14. GCC and MinGW-w64 for Windows
  15. 数据库——sql server安装教程
  16. LAYUI表格自动渲染
  17. 【allegro 17.4软件操作保姆级教程三】布局操作基础二
  18. cad批量打印快捷键_原来CAD还能这么打印?批量打印了解一下?1分钟打印100张...
  19. 读书感受 之 《数学之美》
  20. Windows官方原版操作系统下载

热门文章

  1. Package org.eclipse.aether.metadata
  2. SystemVerilog学习-03-设计特性与接口
  3. MySQL 索引设计
  4. Python Turtle库画一棵对称勾股树,美丽惊艳的分形世界!
  5. JAVA获取CPUID、主板序列号、硬盘序列号、MAC地址
  6. 「大模型」之所短,「知识图谱」之所长
  7. GIS开发:分享开源三维模型查看器
  8. 软考高项—第二章立项管理
  9. OpenHD改造实现廉价高清数字图传(树莓派+PC)—(二)Wifibroadcast Wifi广播通信
  10. joda-time详解