在ScrollView中嵌套GridView,导致GridView不能滑动的问题

本文介绍了解决ScrollView中嵌套GridView时遇到的滑动冲突问题,通过重写BaseScrollView类中的onInterceptTouchEvent方法,使GridView能够响应触摸事件并实现滑动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android开发中,有时根据需要,会在ScrollView中添加GridView,这问题也纠结了好一会,网上查的也对不上,如:

<ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:descendantFocusability="afterDescendants"
        android:id="@+id/scrollView">
        <LinearLayout
            android:id="@+id/pictrue_layout"
            android:orientation="vertical"
            android:gravity="center_horizontal"
            android:descendantFocusability="afterDescendants"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
        <GridView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
            
            </GridView>
        </LinearLayout>
    </ScrollView>

但是在运行以后,发现GridView不能正常滑动,也就是不能根据手势进行滑动了,导致这个问题的原因,在android开发中,程序运行以后;在接收到事件,那么Activity会把接收到的事件优先分发到最上层的View中,在上面的代码中,分发的顺序就是ScollView,如果ScollView没有接收,那么下一个分发的是LinearLayout,只有当上层的所有View都不接收事件时,最下层的View才能接收到事件。上面的GridView不能接收就是因为事件被ScrollView接收了。

解决的办法是让上面的所有的View将事件优先分发到最下层的View,由于上面的LinearLayout不处理事件,所以我们只要将ScrollView的事件优先分发到GridView即可,处理方法就是重写ScrollView里面的部分事件处理方法,方法说明如下:

1)public boolean dispatchTouchEvent(MotionEvent ev)  这个方法用来分发TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 这个方法用来拦截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 这个方法用来处理TouchEvent

由此我们只需要重写onInterceptTouchEvent(MotionEvent ev)方法即可,如果 interceptTouchEvent 返回 true ,也就是拦截掉了,则交给它的 onTouchEvent 来处理,如果 interceptTouchEvent 返回 false ,那么就传递给子 view ,如果子View返回false,那么在递归返回到最上层的View自行处理,最后会丢弃改事件。同时在创建GridView的时候,让起其能直接获得焦点效果会好点。

解决代码是:

 <com.x.BaseScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:descendantFocusability="afterDescendants"
        android:id="@+id/scrollView">
        <LinearLayout
            android:id="@+id/pictrue_layout"
            android:orientation="vertical"
            android:gravity="center_horizontal"
            android:descendantFocusability="afterDescendants"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content">
        <GridView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:focusable="true">

            </GridView>
        </LinearLayout>
    </com.x.BaseScrollView>
重写ScrollView:

/**
 * Created by lingo on 14-12-1.
 */
public class BaseScrollView extends ScrollView{
    public BaseScrollView(Context context) {
        super(context);
    }

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
    }
}
这样GridView就能在ScrollView里面进行滑动了,当然了如果在GridView处于全屏状态下,那么ScrollView就永远接收不到滑动事件,所以根据具体的情况处理。





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值