触摸其中的水平列表视图时,Viewpager禁用滑动问题

时间:2015-09-30 13:52:16

标签: android android-viewpager ontouchlistener horizontallistview

我一直在寻找这个问题的解决方案,因为两天但还没有成功。我已经使用View寻呼机在我的应用程序中显示List视图的详细信息,当刷卡时显示下一个列表项的详细信息。我在视图分页器单项内有水平列表视图的要求。现在我的问题是,当我想要滑动此水平列表视图时,整个View寻呼机项目正在进行Swiped,我还处理了触摸事件,我的水平列表视图禁止浏览寻呼机的滑动动作,但仍然在浏览寻呼机。请帮助我,下面是我的代码

CustomViewPager.Java

import com.devpoint.adapter.HorizontalListView;

import android.content.Context;
import android.graphics.Rect;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class CustomViewPager extends ViewPager {

    private boolean scrollDisable = false;


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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
        if(scrollDisable) {
            return false;
        } else {
            return super.onInterceptTouchEvent(ev);
        }
    }

    public void disableScroll() {
        scrollDisable = true;
    }

    public void enableScroll() {
        scrollDisable = false;
    }



}

这是我查看传呼机项目的单项

details_item.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FFFFFF" >

        <ScrollView
            android:id="@+id/scrollviewid"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="2dp" >

            ------------------------

                    <android.support.v7.widget.CardView
                        xmlns:card_view="http://schemas.android.com/apk/res-auto"
                        android:id="@+id/cardview"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:layout_margin="@dimen/padding_medium"
                        android:background="#FFFFFF"
                        android:clickable="true"
                        android:orientation="vertical"
                        android:padding="35dp"
                        card_view:cardCornerRadius="@dimen/padding_radius" >

                        <TableRow
                            android:layout_width="match_parent"
                            android:layout_height="170dp"
                            android:background="#FFFFFF"
                            android:gravity="center_horizontal"
                            android:orientation="horizontal" >

                            <com.devpoint.adapter.HorizontalListView
                                android:id="@+id/gridview"
                                android:layout_width="match_parent"
                                android:layout_height="match_parent"
                                android:layout_gravity="center"
                                android:columnWidth="60dp"
                                android:horizontalSpacing="10dp"
                                android:numColumns="3"
                                android:padding="10dp"
                                android:stretchMode="columnWidth"
                                android:verticalSpacing="10dp" />
                        </TableRow>
                    </android.support.v7.widget.CardView>



        </ScrollView>



    </RelativeLayout>

我处理了水平Listview内部适配器的触摸项

cardview.setOnTouchListener(new OnTouchListener() {

                public boolean onTouch(View arg0,
                        MotionEvent ev) {
                    switch(ev.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        DetailsViewpagerFragment.viewPager.disableScroll();
                        //enable swiping

                        scrollview.setEnabled(false);
                        break;
                    case MotionEvent.ACTION_MOVE:
                        DetailsViewpagerFragment.viewPager.disableScroll(); 
                        scrollview.setEnabled(false);
                        break;
                    case MotionEvent.ACTION_UP:
                        DetailsViewpagerFragment.viewPager.enableScroll();
                        scrollview.setEnabled(true);
                        break;
                    }
                    return false;
                }

            });

注意:我正在使用我的应用程序中的碎片。谢谢你

任何帮助都会非常非常感谢....

2 个答案:

答案 0 :(得分:2)

我面临与你相同的问题。我希望现在回答你的问题还为时不晚。我解决这个问题的方式:

// Declare Variables 
HorizontalListView listView;
ViewPager viewPager;
ScrollView scrollListView;

我们需要以下变量来解决这个问题。我们可以在Fragment中调用 viewPager

listView = (HorizontalListView) findViewById(R.id.your_list_view);
viewPager = (ViewPager) getActivity().findViewById(R.id.pager);
scrollListView = (ScrollView) swipeView.findViewById(R.id.your_scrollview_layout_id);

现在实施 setOnTouchListener

listView.setOnTouchListener(new View.OnTouchListener() 
{
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
       if (event.getAction() == MotionEvent.ACTION_DOWN)
       {
          // disable swiping of ViewPager
          // disable scrolling of ScrollView
          viewPager.requestDisallowInterceptTouchEvent(true);
          scrollListView.requestDisallowInterceptTouchEvent(true);
       }
       return false;
    }
});

注意**:

(1)此方法不需要自定义ViewPager类。

(2)禁用ScrollView在Horizo​​ntalListView中给我一个更好的滚动性能。

(3)最初我将 setOnTouchListener 实现为Horizo​​ntalListView的父布局(就像你所做的那样),但我没有得到所需的结果。在Horizo​​ntalListView实现setOnTouchListener之后,它运行良好。

希望它也有助于其他人。 ^^ v

答案 1 :(得分:0)

这是nonSwipeable viewpager的代码...希望它能为你效果

public class NonSwipeableViewPager extends ViewPager {

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

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

   @Override
  public boolean onInterceptTouchEvent(MotionEvent event) {
    // Never allow swiping to switch between pages
    return false;
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    // Never allow swiping to switch between pages
    return false;
  }
}