【发布时间】:2015-12-24 06:54:08
【问题描述】:
我有一个ListView,每个项目都是一个水平的RecyclerView。我面临的问题是,水平滚动不是很流畅。如果我以完全水平的方向滚动/滑动,那么它可以正常工作,但如果滚动甚至略微非水平(例如与水平方向成 10 度角),它会将其视为上/下滚动而不是左/右,由于父母ListView。我试过这个方法:
recyclerView.setOnTouchListener(new FlingRecyclerView.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// Disallow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
Log.i("Scroll down", "Intercept true");
break;
case MotionEvent.ACTION_UP:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
case MotionEvent.ACTION_MOVE:
// Allow ScrollView to intercept touch events.
v.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
// Handle HorizontalScrollView touch events.
v.onTouchEvent(event);
return true;
}
});
但这不是很有效。事实上,我并没有注意到太大的改进。那是因为只有当运动完全水平时才会调用这个motionEvent——这种情况已经可以正常工作了。然后我尝试这样做:
class MyGestureDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
Log.i("TAG", "VelocityX " + Float.toString(velocityX) + "VelocityY " + Float.toString(velocityY));
Log.i("TAG", "e1X " + Float.toString(e1.getX()) + "e1Y " + Float.toString(e1.getY()) + "e2X " + Float.toString(e2.getX()) + "e2Y " + Float.toString(e2.getY()));
// downward swipe
if (e2.getY() - e1.getY() > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Downward Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Downward swipe");
}
else if (e1.getY() - e2.getY() > SWIPE_MAX_OFF_PATH && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Upward Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Upward swipe");
}
// right to left swipe
else if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Left Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Left swipe");
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(TestActivity.this, "Right Swipe", Toast.LENGTH_SHORT).show();
Log.i("TAG", "Right swipe");
}
} catch (Exception e) {
// nothing
}
return false;
}
}
我注意到它仅在我松开手指时才记录事件,而不是在我开始滑动时。一旦我触摸RecyclerView,它就不起作用。这也没有产生任何明显的改善。我还注意到一件事,这些方法在某种程度上也依赖于压力。当我用轻微的压力滑动时,什么也没发生。并且在相同的路径上执行相同的操作,更大的压力确实会产生滚动。
即使滑动路径不是水平直线或即使运动是圆形的,是否有任何方法可以使滚动平滑?任何帮助将不胜感激。
【问题讨论】:
-
在 listview 中使用 recyclerview 来实现水平滚动的目的是什么?
-
@Brendon 我的布局是一个提要。它可以垂直滚动,ListView 中的每个项目都是一个画廊。并且画廊有一些可以水平滚动的帖子。
-
所以你只需要水平滚动吗?只需在其中使用水平滚动来膨胀视图,它就会平滑而完美地滚动..换一种方式试试..
-
我之前使用过 ScrollView。毫无疑问,滚动是好的。但是 HorizontalScrollView 没有视图回收,因此我曾经遇到内存不足错误。
标签: android listview scroll android-recyclerview user-experience