如何在ListView中使GridView可触摸?

时间:2014-08-11 13:33:03

标签: android listview gridview android-listview touch-event

我正在尝试在列表视图中实现网格视图。我想禁用列表视图的触摸,并希望在网格视图上执行触摸事件。怎么做? 我需要这样做,因为我已经在网格视图中实现了我的日历,并且我在列表视图中夸大了我的网格视图。

我正在使用下面的自定义列表活动来禁用滚动和触摸事件但仍然触摸我,因为我将“ListViewTouch”和“ListViewDispatchTouch”的日志作为真值。

public class ScrollDisabledListView extends ListView {

private int mPosition;

public ScrollDisabledListView(Context context) {
    super(context);
}

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

public ScrollDisabledListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    Log.d("ListViewTouch", "true");
    return true;
}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    Log.d("ListViewDispatchTouch", "true");
    final int actionMasked = ev.getActionMasked() & MotionEvent.ACTION_MASK;

    if (actionMasked == MotionEvent.ACTION_DOWN) {
        // Record the position the list the touch landed on
        mPosition = pointToPosition((int) ev.getX(), (int) ev.getY());
        return super.dispatchTouchEvent(ev);
    }

    if (actionMasked == MotionEvent.ACTION_MOVE) {
        // Ignore move events
        return true;
    }

    if (actionMasked == MotionEvent.ACTION_UP) {
        // Check if we are still within the same view
        if (pointToPosition((int) ev.getX(), (int) ev.getY()) == mPosition) {
            super.dispatchTouchEvent(ev);
        } else {
            // Clear pressed state, cancel the action
            setPressed(false);
            invalidate();
            return true;
        }
    }

    return super.dispatchTouchEvent(ev);
}

2 个答案:

答案 0 :(得分:0)

尝试将此属性添加到布局文件中的ListView:android:clickable="false"

答案 1 :(得分:0)

 android:descendantFocusability="blocksDescendants"

gridview的{​​{1}}文件中添加此内容。应该这样做。

像这样:

XML