我已经创建了一个自定义视图,您可以用手指绘制路径。它扩展了View类。
当我在ListView中使用它作为其项目之一时,如果用户触摸自定义视图,则滚动ListView。我怎样才能防止这种情况发生?
我想我需要以某种方式在我的自定义视图上获得焦点。但我不知道如何。
更新
我找到了可能的解决方案。在我的自定义视图的onTouchEvent(Motion event)
方法中,我放置了getParent().requestDisallowInterceptTouchEvent(true);
。
如果没有这个,当用户触摸自定义视图时,事件队列如下所示:
当我收到代码为MotionEvent
的{{1}}时,MotionEvent.ACTION_CANCEL
开始滚动。
答案 0 :(得分:2)
在子requestDisallowInterceptTouchEvent(true)
方法中设置onTouch(View, MotionEvent)
有效:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewGroup item = (ViewGroup) inflater.inflate(R.layout.list_item, null);
Button button = (Button)item.findViewById(R.id.list_item_btn);
button.setText("button " + position);
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
listView.requestDisallowInterceptTouchEvent(true);
return false;
}
});
return item;
}
答案 1 :(得分:0)
我认为您还应该扩展ListView小部件。
正如您所说,当您触摸自定义视图时,列表视图将滚动
当您触摸自定义视图时,触摸事件将沿视图层次结构分派,
我认为listview可能会吃掉触摸事件
所以你的customview无法接收触摸事件
如果你不理解触摸事件的发送。
你可以读这个Managing Touch Events in a ViewGroup
最后
我建议你扩展ListView并覆盖 onInterceptTouchEvent()方法。
你可以决定你的ListView是否想要处理 onInterceptTouchEvent()中的触摸事件。
当你判断触摸应该由drawPathView处理,
你可以让ListView不要拦截它
所以你的drawPathView可以得到toch事件
而且listView也不会滚动