【问题标题】:How to get underlying view after a gesture is caught on a row of ListView在一行 ListView 上捕获手势后如何获取底层视图
【发布时间】:2011-12-13 13:18:57
【问题描述】:

场景: 有一个列表视图。用户可以滑动或点击它进行交互。点击时,它会打开一个新的活动,显示列表视图中项目的详细信息。在滑动时,它会切换项目的状态,例如从“已读”到“未读”,反之亦然。

使用 GestureListener 捕获手势

    class MyGestureDetector extends SimpleOnGestureListener{ 

    // Detect a single-click and call my own handler.
    @Override 
    public boolean onSingleTapUp(MotionEvent e) {
        ListView lv = getListView();
        int pos = lv.pointToPosition((int)e.getX(), (int)e.getY());
        myOnItemClick(pos);
        return true;
    }

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
        if (Math.abs(e1.getY() - e2.getY()) > REL_SWIPE_MAX_OFF_PATH) 
            return false; 
        ListView lv = getListView();
        int pos = lv.pointToPosition((int)e1.getX(), (int)e1.getY());
        if(e1.getX() - e2.getX() > REL_SWIPE_MIN_DISTANCE && 
            Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) { 
            onRTLFling(e2, pos); 
        }  else if (e2.getX() - e1.getX() > REL_SWIPE_MIN_DISTANCE && 
            Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) { 
            onLTRFling(e2, pos); 
        } 
        return true; 
    } 

} 

点击方法:

 private void myOnItemClick(int position) {
    //String str = MessageFormat.format("Item clicked = {0,number}", position);
    //Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    int topChild = lv.getFirstVisiblePosition();

    //String text = ((TextView) lv.getChildAt(position + topChild)).getText().toString();
    Toast.makeText(this, "Clicked on item: " + (position + topChild) , Toast.LENGTH_SHORT).show();
    }

从左到右甩的方法:

private void onLTRFling(MotionEvent motionEvent, int position) {
    String text = ((TextView) lv.getChildAt(position)).getText().toString();
    Toast.makeText(this, "Left-to-right fling on item: " + position + "|" + text, Toast.LENGTH_SHORT).show();
    MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);
    cancelEvent.setAction(MotionEvent.ACTION_UP);
    lv.onTouchEvent(cancelEvent);
}

从右向左甩的方法

private void onRTLFling(MotionEvent motionEvent, int position) {
    String text = ((TextView) lv.getChildAt(position)).getText().toString();
    Toast.makeText(this, "Left-to-right fling on item: " + position + "|" + text, Toast.LENGTH_SHORT).show();
    MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);
    cancelEvent.setAction(MotionEvent.ACTION_UP);
    lv.onTouchEvent(cancelEvent);
}

现在,在所有三种方法中,我想访问与行相关的视图(已执行手势)。我尝试使用listView.getChild(position),其中“位置”是我在“MyGestureDetetor”类中计算的“pos”。在滚动列表视图之前它工作正常。我发现每次滚动列表视图时位置都会发生变化。

有没有一种方法可以让我访问底层视图并像使用“onItemClickListener”一样对其进行操作?

【问题讨论】:

    标签: android listview gesture


    【解决方案1】:

    我试图做同样的事情。我想根据检测到的手势对视图实施操作。对我来说,当检测到足够的移动时,只需更改 ListView 项目的背景颜色或边框。

    使用问题 int pos = lv.pointToPosition((int)e.getX(), (int)e.getY()); 查看 v = lv.getChildAt(pos) 是视图不一定与项目的位置相关。所以基本上'pos'变量是视图后面数据的索引,不一定是视图本身。

    因此,对于当前的解决方案,将额外的标志放在数据对象中并响应您想要对 ListView Adapter .getView() 部分中的视图进行的任何更改可能会更容易,尽管可以说不是那么清楚.

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多