listView的标题中的ViewFlipper和onTouchListener

时间:2012-06-30 15:57:12

标签: android listview viewflipper

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

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

这是一个架构:

enter image description here

首先,我尝试使用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;
            }
        });

1 个答案:

答案 0 :(得分: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并将事件正确分派到寻呼机。