android - 如何在 Android Studio 中的完整 RecyclerView(不是项目)上实现向下滑动手势?
问题描述
我想在 RecyclerView 布局中实现向下滑动手势,而不是在整个布局上。我当前的代码向布局添加了一个手势,但如果我在 RecyclerView 列表上擦拭,它就不起作用。
package com.example.surajpatil.sp_gesturedemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector.OnGestureListener;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity implements OnGestureListener
{
MyRecyclerViewAdapter adapter;
GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// data to populate the RecyclerView with
ArrayList<String> roomNames = new ArrayList<>();
roomNames.add("Hall");
roomNames.add("Dinning");
roomNames.add("Patio");
roomNames.add("Bedroom");
roomNames.add("Master Bedroom");
roomNames.add("Kitchen");
roomNames.add("Porch");
roomNames.add("Hall Way");
roomNames.add("Bathroom");
// set up the RecyclerView
RecyclerView recyclerView = findViewById(R.id.rvRooms);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter = new MyRecyclerViewAdapter(this, roomNames);
// adapter.setClickListener(this);
recyclerView.setAdapter(adapter);
gestureDetector = new GestureDetector(MainActivity.this, MainActivity.this);
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent motionEvent1, MotionEvent motionEvent2, float X, float Y) {
if(motionEvent1.getY() - motionEvent2.getY() > 50){
Toast.makeText(MainActivity.this , " Swipe Up " , Toast.LENGTH_LONG).show();
return true;
}
if(motionEvent2.getY() - motionEvent1.getY() > 50){
Toast.makeText(MainActivity.this , " Swipe Down " , Toast.LENGTH_LONG).show();
return true;
}
if(motionEvent1.getX() - motionEvent2.getX() > 50){
Toast.makeText(MainActivity.this , " Swipe Left " , Toast.LENGTH_LONG).show();
return true;
}
if(motionEvent2.getX() - motionEvent1.getX() > 50) {
Toast.makeText(MainActivity.this, " Swipe Right ", Toast.LENGTH_LONG).show();
return true;
}
else {
return true ;
}
}@Override
public boolean onTouchEvent(MotionEvent motionEvent) {
// TODO Auto-generated method stub
return gestureDetector.onTouchEvent(motionEvent);
}
请帮我在 RecyclerView 上实现向下滑动手势,我应该做哪些代码更改?我有两个 XML,一个是具有 RecyclerView 的 activity_main,另一个是 recyclerview_row。除此之外,我还有一个 MyRecyclerViewAdapter.java 文件,它创建、保存视图并对数据进行投标。
解决方案
子类 RecyclerView 并创建您的自定义视图,然后覆盖 onInterceptTouchEvent 并监听手势,如下所示:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
gestureDetector.onTouchEvent(ev);
...
更新: 作为自定义视图示例,我为您的案例创建了样板代码,我希望这将成为您的 customViews 的入口点:
MyCustomRecyclerView.java
package com.example.myrecyclerview;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
public class MyCustomRecyclerView extends RecyclerView {
private GestureDetectorCompat gestureDetector;
public MyCustomRecyclerView(@NonNull Context context) {
super(context);
init(context, null);
}
public MyCustomRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public MyCustomRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs) {
gestureDetector = new GestureDetectorCompat(context, gestureListener);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
gestureDetector.onTouchEvent(e);
return super.onInterceptTouchEvent(e);
}
private final GestureDetector.OnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (getParent() != null)
getParent().requestDisallowInterceptTouchEvent(true);
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.i("TAG", "onFling: ");
return super.onFling(e1, e2, velocityX, velocityY);
}
@Override
public boolean onDown(MotionEvent e) {
Log.i("TAG", "onDown: ");
return super.onDown(e);
}
};
}
并如下使用它:
<com.example.myproject.MyCustomRecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.example.myproject.MyCustomRecyclerView>
推荐阅读
- windows - Windows ReadFile 可以在不读取您要求的所有内容的情况下返回成功吗?
- javascript - 为什么我在扩展时需要 superClass.prototype 中的 .prototype?
- freebsd - 启动apache22失败
- c# - ASP.NET 验证 - 如何使用带有 DataAnnotation 错误消息的参数
- java - 如何处理 SpringBoot ListenableFuture 中的异常
- mysql - MYSQL:在一个条件下连接三个表
- javascript - "then" 在 Promise 之后不执行
- python - 如何将宽吻 Python 库与 MWS 一起使用
- c# - 反方向跑?
- composer-php - 如何在 laravel 5.6 中正确升级引导程序?