【问题标题】:Viewpager disable swipe Issue when touch on Horizontal Listview inside it触摸其中的水平列表视图时,Viewpager 禁用滑动问题
【发布时间】:2015-09-30 13:52:15
【问题描述】:

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

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;
    }



}

它是我的 View Pager Item 中的单个项目

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>

我在适配器内处理了水平列表视图的触摸项目

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;
                }

            });

注意:我在我的应用程序中使用片段。谢谢

任何帮助将非常非常非常感谢......

【问题讨论】:

标签: android android-viewpager ontouchlistener horizontallistview


【解决方案1】:

我面临和你一样的问题。我希望现在回答你的问题还为时不晚。我解决这个问题的方法:

// 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

【讨论】:

    【解决方案2】:

    这是 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;
      }
    }
    

    【讨论】:

    • 感谢@Abhinav Singh Maurya.. 但是当从水平列表视图中的 ACTION_MOVEUP 时,Viewpager 必须刷卡,它会工作吗?
    • @Harikrishna 我不知道你必须应用此代码并检查它。
    • 我应用了代码,但它不起作用..viewpager 完全失去了它的滑动动作,但我的要求是当我滑动水平 Listview 滑动将禁用,如果不滑动必须工作.thanks @Abhinav跨度>
    • 我的问题的任何解决方案@Abhinav Singh Maurya
    • @Harikrishna 抱歉,我现在没有。如果我遇到任何问题,我一定会将其发布为答案
    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多