在android开发中会碰到有顶部导航并且下面显示的内容是一个listview,此时要想实现左右滑动切换顶部导航的选项是不能实现的,因为listview自己消耗横向滑动事件。因为我可以通过继承listview,对左右滑动事件进行消耗,不在让原生的listview处理。
效果图:
思路就是继承listview,设置一个GestureDetector监听滑动手势,如果左右滑动进行处理调用一个自己写的左右滑动的接口。
下面是我封装的一个可以接受左右滑动的listview,其他用法跟普通的listview一样,可以直接使用:
package com.yasin.libs;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.ListView;
/*
* 该listview是对左右滑动进行了监听,
* 我也写一个OnFlingListener接口,使用该listview的时候通过setOnFlingListener接口即可实现左右滑动时要实现的操作
* */
public class HSlidableListView extends ListView {
Context context;
GestureDetector gestureDetector;
OnFlingListener mListener;
/*
* 设置左右滑动监听
* */
public void setOnFlingListener(OnFlingListener listener) {
this.mListener = listener;
gestureDetector = new GestureDetector(context, new Gesture(context,
mListener));
}
public HSlidableListView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public HSlidableListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
public HSlidableListView(Context context) {
super(context);
this.context = context;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (gestureDetector.onTouchEvent(ev))
return true;//当左右滑动时自己处理
return super.onTouchEvent(ev);
}
/*
* 滑动监听
* */
public class Gesture implements OnGestureListener {
Context context;
OnFlingListener mListener;
public Gesture(Context context, OnFlingListener listener) {
this.context = context;
this.mListener = listener;
}
@Override
pub