2014-04-27 27 views
0

我有一個使用自定義適配器的列表視圖。每行都有一些文本和一個可點擊的FrameLayout,其上設置了onClickListener。行可以通過刷卡刪除(如Gmail或環聊)。我正在使用Roman Nurik的SwipeToDismiss庫。問題是可點擊的FrameLayout佔用一半的行空間,所以很難將該行劃掉,因爲它消耗了MOVE事件。將觸摸事件(移動/滑動)傳遞給父級,但在當前視圖上保留單擊事件

我讀過,我可以通過擴展FrameLayout和重寫dispatchTouchEvent方法將事件傳遞給父視圖。我已經嘗試過,但所有事件都通過了,因此FrameLayout不再是可點擊的。

我也試過這樣:

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_MOVE) { 
     return false; 
    } 
    return super.dispatchTouchEvent(ev); 
} 

,但它看起來像曾經認爲「得到」的DOWN事件,它不會將它傳遞給父母了。

我的問題: 我應該怎麼做,在當前視圖上保持onClick事件,但將MOVE事件傳遞給父視圖?

+0

我應該取消運動事件,並在發生ACTION_MOVE時將其傳遞給父項。我怎麼做? – tomziwar

回答

3

我明白了。我伸出的FrameLayout和overrided方法dispathTouchEvent:

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_MOVE) { 
     //if move event occurs 
     long downTime = SystemClock.uptimeMillis(); 
     long eventTime = SystemClock.uptimeMillis() + 100; 
     float x = ev.getRawX(); 
     float y = ev.getRawY(); 
     int metaState = 0; 
     //create new motion event 
     MotionEvent motionEvent = MotionEvent.obtain(
       downTime, 
       eventTime, 
       MotionEvent.ACTION_DOWN, 
       x, 
       y, 
       metaState 
     ); 
     //I store a reference to listview in this layout 
     listview.dispatchTouchEvent(motionEvent); //send event to listview 
     return true; 
    } 
    return super.dispatchTouchEvent(ev); 
} 

現在的FrameLayout是點擊,但MOVE發生後,它會創建一個新的MotionEvent並將其發送給ListView的,其中內容被滾動或滑掉。我應該爲MOVE事件添加一些+,因爲當你用手指按下時,你通常會用它來做一些MOVE事件。

相關問題