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