zoukankan      html  css  js  c++  java
  • Android ListView通过触摸消息来计算item位置

    有时候,listview的哪个item被点击了或触摸了没法很直接的得到。

    下面就利用MotionEvent的坐标来计算item位置。

    其中有几个值得注意的方法。

    getChildAt(),
    getGlobalVisibleRect(),
    getFirstVisiblePosition(),
     
     1 public void onTapDown(MotionEvent ev, ListView listview)
     2     {
     3         float eY = ev.getY();
     4         Rect r = new Rect();
     5         /*获取第一个可见item相对于listview的可见区域,
     6          * 注意getChildAt(0)得到的是listview这个ViewGroup中的第一个子view,
     7          * 如果listview的adapter中getView进行了优化,
     8          * 则listview的子view个数是屏幕可最多显示的item个数,
     9          * 此时得到的子view并不一定对应adapter数据的第一项。
    10          * */
    11         listview.getChildAt(0).getGlobalVisibleRect(r);
    12         /*这里得到的position是和list数据列表真实对应的*/
    13         int first = listview.getFirstVisiblePosition();
    14         int index_in_adapter = first;
    15         int count = 0;
    16         int index_of_childview = 0;
    17         
    18         /*第一个可见项是listview header*/
    19         if(0 == first)
    20         {
    21             if(eY > r.height())
    22             {
    23                 /*触摸不在listview header上,根据触摸的Y坐标和listitem的高度计算索引*/
    24                 count = (int) ((eY - r.height())/listview.getChildAt(1).getHeight());
    25                 index_of_childview = count + 1;
    26                 index_in_adapter += count;
    27             }
    28             else
    29             {
    30                 /*触摸在listview header上*/
    31                 return;
    32             }
    33         }
    34         /*第一个可见项不是listview header*/
    35         else
    36         {
    37             if(eY > r.height())
    38             {
    39                 /*用触摸点坐标和item高度相除来计算索引*/
    40                 count = (int) ((eY - r.height())/listview.getChildAt(1).getHeight());
    41                 index_of_childview = count + 1;
    42                 index_in_adapter += count;
    43             }
    44             else
    45             {
    46                 index_of_childview = 0;
    47                 index_in_adapter -= 1;
    48             }
    49         }
    50         
    51         /*这即是触摸的那个list item view.*/
    52         ViewGroup child_view = (ViewGroup)listview.getChildAt(index_of_childview);
    53         /*index_in_adapter即是触摸的子item view在adapter中对应的数据项*/
    54         /*index_of_childview即是触摸的item view在listview中的索引*/
    55     }
  • 相关阅读:
    【网络游戏同步技术】帧同步的一致性
    【C++】STL常用容器总结之五:双端队列deque
    使 egg-multipart 同时支持 stream 和 file
    react + 图灵api 实现模拟客服
    egg 扩展上传文件白名单
    input[type=file] 样式美化,input上传按钮美化
    react-lazyload 实现图片懒加载
    useEffect 模拟 react 生命周期
    egg 实现下载数据,并保存成excel文件
    egg 实现上传excel,并解析保存到数据库
  • 原文地址:https://www.cnblogs.com/jayceli/p/2746517.html
Copyright © 2011-2022 走看看