【发布时间】:2015-09-30 12:39:41
【问题描述】:
这是我的old question。不过这次我也提供了我的代码。
我有一个包含不同类型行的 ListView。该行可能包含文本、图像、视频或其他内容。如果我单击 ImageView(行内),我将转到另一个活动以全屏显示图像,如果我单击视频(行内),我将转到另一个活动以播放视频。
我已经在我的 ListView 上实现了从右到左滑动监听器。如果我从 ListView 中的空白区域开始 ListView 滑动,则滑动有效(下图中的第一行和第二行)。但是,如果我从 ListView 行的项目开始 ListView 滑动,则滑动不起作用(下图中的第三和第四行)。如果我从 ImageView 和 Video 中删除点击事件,那么即使我从 ListView 行的项目开始滑动,滑动也会起作用,即在这种情况下,无论我在哪一行滑动,滑动都适用于整个 ListView。
我怎样才能摆脱这个问题?我认为如果我禁用 ListView 中所有项目的所有点击事件,就可以实现这一点。怎么能这样?有没有其他办法?
我希望在 ListView 上滑动并单击 ListView 的项目。
SwipeDetector.java - 用于检测 ListView 上的滑动
public class SwipeDetector implements View.OnTouchListener {
private SwipeListener swipeListener;
private ListView mListView;
private int hundred;
private boolean motionInterceptDisallowed = false;
public static enum Action {
LR, // Left to right
RL, // Right to left
TB, // Top to bottom
BT, // Bottom to top
None // Action not found
}
private static final int HORIZONTAL_MIN_DISTANCE = 30; // The minimum
// distance for
// horizontal swipe
private static final int VERTICAL_MIN_DISTANCE = 80; // The minimum distance
// for vertical
// swipe
private float downX, downY, upX, upY; // Coordinates
private Action mSwipeDetected = Action.None; // Last action
public SwipeDetector(Context context, ListView listView) {
hundred = (int) context.getResources().getDimension(R.dimen.hundred);
mListView = listView;
}
public boolean swipeDetected() {
return mSwipeDetected != Action.None;
}
public Action getAction() {
return mSwipeDetected;
}
/**
* Swipe detection
*/@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
{
downX = event.getX();
downY = event.getY();
mSwipeDetected = Action.None;
return false; // allow other events like Click to be processed
}
case MotionEvent.ACTION_MOVE:
{
upX = event.getX();
upY = event.getY();
float deltaX = downX - upX;
float deltaY = downY - upY;
float absX = Math.abs(deltaX);
float absY = Math.abs(deltaY);
if((absX >= (3 * absY)) && absX > HORIZONTAL_MIN_DISTANCE && mListView != null && !motionInterceptDisallowed) {
mListView.requestDisallowInterceptTouchEvent(true);
motionInterceptDisallowed = true;
}
if((absX >= (3 * absY)) && absX <= hundred) {
if (deltaX > 0) {
mSwipeDetected = Action.RL;
swipeListener.onSwipe(MotionEvent.ACTION_MOVE, Action.RL, absX);
}
}
return false;
}
case MotionEvent.ACTION_UP:
swipeListener.onSwipe(MotionEvent.ACTION_UP, Action.BT, 0);
if (mListView != null) {
mListView.requestDisallowInterceptTouchEvent(false);
motionInterceptDisallowed = false;
}
return false;
case MotionEvent.ACTION_CANCEL:
return true;
}
return false;
}
/**
* Set chat send listener
* @param listener
*/
public void setSwipeListener(SwipeListener listener) {
swipeListener = listener;
}
public interface SwipeListener {
void onSwipe(int event, Action action, float x);
}
}
这就是我在 ListView 上设置 SwipeDetector 的方式
final SwipeDetector swipeDetector = new SwipeDetector(SwipeActivity.this, mListView);
swipeDetector.setSwipeListener(mSwipeListener);
mListView.setOnTouchListener(swipeDetector);
我的 Activity 实现了SwipeDetector.SwipeListener
下面是重写的 onSwipe() 方法
@Override
public void onSwipe(int event, SwipeDetector.Action action, float x) {
switch (event) {
case MotionEvent.ACTION_MOVE:
System.out.println("list move");
break;
case MotionEvent.ACTION_UP:
System.out.println("list up");
break;
}
}
在我的适配器中,我在 TextView、ImageView 和 VideoView 上设置 onClickListener()
holder.mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("item textview click");
}
});
holder.mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("item imageview click");
}
});
holder.mVideoView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("item videoview click");
}
});
当我从 ListView 的空白区域开始滑动时,ListView 的滑动侦听器会捕获它。但是,当我从 TextView/ImageView/VideoView 开始滑动时,会触发 View 的 onClickListener 而不是父级(ListView)的 onTouchListener()。
如何实现相同的功能?我希望当我点击 ListView 的项目时,该项目的 onClick 应该被触发,当我在 ListView 的项目上滑动时,ListView 的 onSwipe 应该被触发。
【问题讨论】:
-
你有答案了吗?我陷入了同样的境地
-
@ArjunnSingh 是的,我已经实现了这个。你的方案是什么?
-
仍然陷入同样的境地。我也有一个带有图像视图、视频视图和文本视图的列表视图,文本视图正在滑动,但图像视图和视频视图没有。请指导。
标签: android android-listview swipe