• 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     }
  • 相关阅读:
    11 数值的整数次方
    10 二进制中1的个数
    6 重建二叉树
    5 从尾到头打印链表
    计算机网络面试题
    Http和Https的区别
    UVALive 7749 Convex Contour (计算几何)
    Gym 101190H Hard Refactoring (模拟坑题)
    UVa 11324 The Largest Clique (强连通分量+DP)
    HDU 6006 Engineer Assignment (状压DP)
  • 原文地址:https://www.cnblogs.com/jayceli/p/2746517.html
Copyright © 2020-2023  润新知