1

在我的应用程序中,我有一个 listView。我有一个 ViewFlipper,它是 ListView 的标题。

我希望 ViewFlipper 在用户触摸并滑动时切换视图。此外,ViewFlipper 的项目是可点击的。我的问题是我的 ListView 也是可滚动的,但垂直且可点击。

这是一个架构:

在此处输入图像描述

首先,我尝试使用 OnTouchEvent。它不起作用,因为即使用户触摸 ViewFlipper 的屏幕 OUT 也会调用该方法。

现在,如果我使用 OuTouchListener,我无法截获用户的手势,也无法弄清楚。

下面是 listView 标头的 XML 代码示例:

<ViewFlipper
    android:id="@+id/flipune"
    android:layout_width="fill_parent"
    android:layout_height="0dip"
    android:layout_weight="3" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <ImageButton
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/itemviewflipper1"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:background="@android:color/transparent"
            android:contentDescription="@string/stritemviewflipper" />

        <TextView
            android:id="@+id/titreviewflipper1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/itemviewflipper1"
            android:background="#AA000000"
            android:paddingTop="10dip"
            android:textColor="#ffffffff"
            android:textSize="12dip"
            android:textStyle="bold" >
        </TextView>
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >

        <ImageButton
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/itemviewflipper2"
            android:layout_width="wrap_content"
            android:layout_height="150dp"
            android:background="@android:color/transparent"
            android:contentDescription="@string/stritemviewflipper" />

        <TextView
            android:id="@+id/titreviewflipper2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/itemviewflipper2"
            android:background="#AA000000"
            android:paddingTop="10dip"
            android:textColor="#ffffffff"
            android:textStyle="bold" >
        </TextView>
    </RelativeLayout>

        [...]

</ViewFlipper>

我在活动中定义了 OnTouchListener :

viewFlipper.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent touchevent) {
                switch (touchevent.getAction()) {
                case MotionEvent.ACTION_DOWN: {
                    oldTouchValue = touchevent.getX();
                    break;
                }
                case MotionEvent.ACTION_UP: {           

                    float currentX = touchevent.getX();
                    if (touchevent.getY() < metrics.heightPixels / 3) {
                        if (!viewFlipper.isPressed() && oldTouchValue == currentX) {
                            openDescriptionArticle(index);
                        } else {
                            if (oldTouchValue < currentX) {
                                viewFlipper.setInAnimation(AnimationHelper
                                        .inFromLeftAnimation());
                                viewFlipper.setOutAnimation(AnimationHelper
                                        .outToRightAnimation());
                                viewFlipper.showPrevious();
                                if (index > 0) {
                                    index--;
                                } else {
                                    index= 4;
                                }
                            }
                            if (oldTouchValue > currentX) {
                                viewFlipper.setInAnimation(AnimationHelper
                                        .inFromRightAnimation());
                                viewFlipper.setOutAnimation(AnimationHelper
                                        .outToLeftAnimation());
                                viewFlipper.showNext();
                                if (index < 4) {
                                    index++;
                                } else {
                                    index = 0;
                                }
                            }
                        }
                    }
                    break;
                }
                }
                return false;
            }
        });
4

1 回答 1

0

就我而言,有一个HorizontalPager内部ListView标题。ListView 抓取触摸事件和寻呼机冻结。我通过ListView使用scrollingEnabled选项实现自定义解决了这个问题。

public class StoppableListView extends ListView {
    public boolean scrollingEnabled = true;
    YourActivity parent;

    public StoppableListView(Context context) { super(context); parent = (CalendarActivity)context; }
    public StoppableListView(Context context, AttributeSet attrs) { super(context, attrs); parent = (CalendarActivity)context; }
    public StoppableListView(Context context, AttributeSet attrs, int defStyle) { super(context,attrs); parent = (CalendarActivity)context; }


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (scrollingEnabled) return super.dispatchTouchEvent(ev);
        // dispatch touch event to your view
        else return parent.yourView.dispatchTouchEvent(ev);
    }

} 

当寻呼机处于活动状态时,我设置listView.scrollingEnabled = false并将事件正确分派给寻呼机。

于 2013-03-22T13:23:17.883 回答