自定义view系列(4)--判断滑动方向的ListView

本文介绍如何在Android中通过自定义View轻松判断ListView的滑动方向,避免传统OnScrollListener方法的复杂性和局限性。示例代码展示了在ListView的OnTouchEvent中监听滑动,提供更简洁的解决方案。

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

使用ListView时.现在一些流行的应用会根据ListView实时的滑动方向来显示或隐藏一些布局,比如知乎,掘金等应用.

判断ListView的滑动方向其实不难,只需要在它的OnScrollListener中进行相应的操作即可,网上也有很多教程,但是这样做很麻烦,因为有些ListView的Item很高,当ListView的多次滑动距离没有超过一个Item的高度时,判断是向上滑动还是向下滑动会有问题.想解决这个问题,还得再判断滑动的距离有没有超过一个item的高度,并且这种方式还有其他问题需要解决,所以实现起来很麻烦.

而采用自定义view的方式,监听ListView的OnTouchEvent,实现起来会更简单.代码如下:

package com.lanma.lostandfound.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.widget.ListView;

/**
 * 作者 qiang_xi on 2016/9/3 18:03.
 */
public class DirectionListView extends ListView {
    private OnScrollDirectionListener mListener;
    private float startY = 0;//按下时y值
    private int mTouchSlop;//系统值

    public DirectionListView(Context context) {
        this(context, null);
    }

    public DirectionListView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DirectionListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                startY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                if (Math.abs(ev.getY() - startY) > mTouchSlop) {
                    if (ev.getY() - startY >= 0) {
                        mListener.onScrollDown();
                    } else {
                        mListener.onScrollUp();
                    }
                }
                startY = ev.getY();
                break;
        }
        return super.onTouchEvent(ev);
    }

    public void setOnScrollDirectionListener(OnScrollDirectionListener listener) {
        this.mListener = listener;
    }

    public interface OnScrollDirectionListener {
        //向上滑动
        void onScrollUp();

        //向下滑动
        void onScrollDown();
    }
}

使用方式和普通的ListView没有任何区别,你只需要设置一下滑动方向的监听即可.然后在向上滑动或向下滑动的回调监听中,隐藏或显示我们的布局即可.

效果图如下:



其实也可以直接使用普通的ListView,然后注册它的OnTouchEvent事件,然后把上面的逻辑拷贝一份也是一样的效果,代码就不贴了.不过个人认为还是自定义view的方式比较好一点,可以降低与Activity的耦合度,代码看起来更清爽直观.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值