【Android】从无到有:手把手一步步教你自定义RecyclerView手势监听

版权声明:本文为博主原创文章,商业转载请联系博主获得授权,非商业转载请注明出处,否则追究其法律责任。 https://blog.csdn.net/u013642500/article/details/80488425

转载请注明出处,原文链接:https://blog.csdn.net/u013642500/article/details/80488425

【前言】

1、关于如何构建并使用RecyclerView,请参考:https://blog.csdn.net/u013642500/article/details/80480906

2、本文可以实现 GestureDetector 类的全部手势操作方法,包括 onSingleTapUp、onLongPress、onScroll、onFling、onShowPress、onDown、onDoubleTap、onDoubleTapEvent、onSingleTapConfirmed、onContextClick。

3、手势操作各个方法的含义,请参考:https://blog.csdn.net/u013642500/article/details/80489115

【构造自定义监听器】

1、新建 RecyclerItemClickListener 类,添加 RecyclerView.OnItemTouchListener 接口。

package com.test.myapplication;

import android.support.v7.widget.RecyclerView;
import android.view.MotionEvent;

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

2、写四个全局变量:

    private OnItemClickListener mListener;
    private GestureDetector mGestureDetector;
    private View childView;
    private RecyclerView touchView;

3、重写 onInterceptTouchEvent 方法:

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        touchView = rv;
        childView = rv.findChildViewUnder(e.getX(), e.getY());
        mGestureDetector.onTouchEvent(e);
        return false;
    }

4、写一个接口 OnItemClickListener(方法自定义,想写几个几个,看你的需求了):

    public interface OnItemClickListener {
        void onItemClick(View view, int position);

        void onLongClick(View view, int position);

        void onScroll(View view, int position);
    }

5、写构造函数,有两个参数:Context context 和 RecyclerItemClickListener.OnItemClickListener listener:

    public RecyclerItemClickListener(Context context, RecyclerItemClickListener.OnItemClickListener listener){

    }

6、在构造函数中,实例化 GestureDetector 类对象:

    public RecyclerItemClickListener(Context context, RecyclerItemClickListener.OnItemClickListener listener){
        mListener = listener;
        mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener());
    }

7、重写 GestureDetector.SimpleOnGestureListener 类的方法(需要几个写几个):

        mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return super.onSingleTapUp(e);
            }

            @Override
            public void onLongPress(MotionEvent e) {
                super.onLongPress(e);
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                return super.onScroll(e1, e2, distanceX, distanceY);
            }
        });

8、自定义接口与手势之间的“绑定”:

        mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                if (childView != null && mListener != null) {
                    mListener.onItemClick(childView, touchView.getChildAdapterPosition(childView));
                }
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                if (childView != null && mListener != null) {
                    mListener.onLongClick(childView, touchView.getChildAdapterPosition(childView));
                }
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                if (childView != null && mListener != null) {
                    mListener.onScroll(childView, touchView.getChildAdapterPosition(childView));
                }
                return true;
            }
        });

【使用自定义监听器】

在 MainActivity 中,给 RecyclerView 对象添加 item 触摸监听:

        recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(getApplicationContext(), "点击了第" + position + "项", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongClick(View view, int position) {
                Toast.makeText(getApplicationContext(), "长按了第" + position + "项", Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onScroll(View view, int position) {
                Toast.makeText(getApplicationContext(), "滑动了", Toast.LENGTH_SHORT).show();
            }
        }));

【成果】

【源代码】

RecyclerItemClickListener.java:

package com.test.myapplication;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    private OnItemClickListener mListener;
    private GestureDetector mGestureDetector;
    private View childView;
    private RecyclerView touchView;

    public RecyclerItemClickListener(Context context, RecyclerItemClickListener.OnItemClickListener listener){
        mListener = listener;
        mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                if (childView != null && mListener != null) {
                    mListener.onItemClick(childView, touchView.getChildAdapterPosition(childView));
                }
                return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {
                if (childView != null && mListener != null) {
                    mListener.onLongClick(childView, touchView.getChildAdapterPosition(childView));
                }
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                if (childView != null && mListener != null) {
                    mListener.onScroll(childView, touchView.getChildAdapterPosition(childView));
                }
                return true;
            }
        });
    }

    public interface OnItemClickListener {
        void onItemClick(View view, int position);

        void onLongClick(View view, int position);

        void onScroll(View view, int position);
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        touchView = rv;
        childView = rv.findChildViewUnder(e.getX(), e.getY());
        mGestureDetector.onTouchEvent(e);
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

MainActivity.java:

package com.test.myapplication;

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.View;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<List<String>> mList = new ArrayList<>();
        List<String> tempList;

        tempList = new ArrayList<>();
        tempList.add("王一");
        tempList.add("18");
        mList.add(tempList);

        tempList = new ArrayList<>();
        tempList.add("赵二");
        tempList.add("19");
        mList.add(tempList);

        tempList = new ArrayList<>();
        tempList.add("李三");
        tempList.add("16");
        mList.add(tempList);

        tempList = new ArrayList<>();
        tempList.add("孙四");
        tempList.add("20");
        mList.add(tempList);

        // 初始化 RecyclerView
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        // 实例化LinearLayoutManager对象
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        // 设置 RecyclerView 布局为线性布局
        recyclerView.setLayoutManager(linearLayoutManager);
        // 实例化 Adapter
        MyRecyclerView adapter = new MyRecyclerView(this, mList);
        // 设置 Adapter
        recyclerView.setAdapter(adapter);

        recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Toast.makeText(getApplicationContext(), "点击了第" + position + "项", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongClick(View view, int position) {
                Toast.makeText(getApplicationContext(), "长按了第" + position + "项", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onScroll(View view, int position) {
                Toast.makeText(getApplicationContext(), "滑动了", Toast.LENGTH_SHORT).show();
            }
        }));
    }
}

由于本人安卓知识及技术有限,本文如有错误或不足请评论指出,非常感谢!

猜你喜欢

转载自blog.csdn.net/u013642500/article/details/80488425