【问题标题】:How to implement swipe down gesture on a complete RecyclerView (not an item) in Android Studio?如何在 Android Studio 中对完整的 RecyclerView(不是项目)实现向下滑动手势?
【发布时间】:2018-10-26 03:24:34
【问题描述】:

我想在 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 文件,它创建、保存视图并对数据进行投标。

【问题讨论】:

    标签: android


    【解决方案1】:

    子类 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>
    

    【讨论】:

    • 在我的情况下我该怎么做? Subclass RecyclerView and create your customview
    • @SurajPatil 我更新了我的答案,请看一下。
    • 谢谢,效果很好,但我仍然面临另一个问题,那就是在向下滑动后我无法切换到另一个活动。在MyCustomRecyclerView.java `@Override public boolean onDown(MotionEvent e) { Toast.makeText(getContext(), " Swipe Down ", Toast.LENGTH_SHORT).show();意图 homeIntent = new Intent(this, HomeActivity.class);开始活动(家庭意图);返回 super.onDown(e); } ` 这给了我一个错误;有什么我做错了吗?
    • 我很高兴它有效。如果答案对您来说没问题,请接受并提出另一个问题。因为您的新问题与 recyclerview 手势无关。
    猜你喜欢
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多