不要滚动带有自定义视图的ListView

时间:2013-10-04 02:46:12

标签: android listview custom-view

我已经创建了一个自定义视图,您可以用手指绘制路径。它扩展了View类。

当我在ListView中使用它作为其项目之一时,如果用户触摸自定义视图,则滚动ListView。我怎样才能防止这种情况发生?

我想我需要以某种方式在我的自定义视图上获得焦点。但我不知道如何。

更新

我找到了可能的解决方案。在我的自定义视图的onTouchEvent(Motion event)方法中,我放置了getParent().requestDisallowInterceptTouchEvent(true);

如果没有这个,当用户触摸自定义视图时,事件队列如下所示:

  1. MotionEvent.ACTION_DOWN
  2. MotionEvent.ACTION_MOVE
  3. MotionEvent.ACTION_MOVE
  4. MotionEvent.ACTION_CANCEL
  5. 当我收到代码为MotionEvent的{​​{1}}时,MotionEvent.ACTION_CANCEL开始滚动。

2 个答案:

答案 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也不会滚动