Android listview标题通过触摸到后面的视图

Android listview标题通过触摸到后面的视图,android,listview,android-linearlayout,Android,Listview,Android Linearlayout,我有一个带有自定义类头的listview,它是完全透明的。在列表视图后面,我有一个地图视图,它通过透明的标题显示 我正试图使这项工作,这样,如果用户滚动我的触摸列表视图上的任何一行,那么列表视图就会滚动。但是,如果用户正在触摸listview的顶部透明标题部分,则listview不应拦截触摸,而应将其传递给后面的mapview(这允许用户在mapview上平移/缩放) 我目前无法做到这一点,因为listview一直在窃取这些内容。我找到了解决方案 使用自定义ListView类: package

我有一个带有自定义类头的listview,它是完全透明的。在列表视图后面,我有一个地图视图,它通过透明的标题显示

我正试图使这项工作,这样,如果用户滚动我的触摸列表视图上的任何一行,那么列表视图就会滚动。但是,如果用户正在触摸listview的顶部透明标题部分,则listview不应拦截触摸,而应将其传递给后面的mapview(这允许用户在mapview上平移/缩放)

我目前无法做到这一点,因为listview一直在窃取这些内容。

我找到了解决方案

使用自定义ListView类:

package xxx.xxx.xxxxxx;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ListView;

public class HeaderUntouchableListView extends ListView {
    private View mHeaderView;
    private boolean isDownEventConsumed;

    public HeaderUntouchableListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void addHeaderView(View v) {
        super.addHeaderView(v);
        this.mHeaderView = v;
    }

    @Override
    public void addHeaderView(View v, Object data, boolean isSelectable) {
        super.addHeaderView(v, data, isSelectable);
        this.mHeaderView = v;
    }

    /**
     * list header should not consume the event, and list item should consume the event
     * consumed here is replaced with super.dispatchTouchEvent(motionEvent)
     * @param motionEvent
     * @return is event consumed
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent motionEvent) {
        if(mHeaderView == null) return super.dispatchTouchEvent(motionEvent);
        if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
            //if touch header not to consume the event
            Rect rect = new Rect((int) mHeaderView.getX(), (int) mHeaderView.getY(), mHeaderView.getRight(), mHeaderView.getBottom());
            if(rect.contains((int)motionEvent.getX(), (int)motionEvent.getY())){
                isDownEventConsumed = false;
                return isDownEventConsumed;
            }else {
                isDownEventConsumed = true;
                return super.dispatchTouchEvent(motionEvent);
            }
        }else{
            //if touch event not consumed, then move/up event should be the same
            if(!isDownEventConsumed)return isDownEventConsumed;
            return super.dispatchTouchEvent(motionEvent);
        }
    }
}