RecyclerView 中的 OnLongItemClick [英] OnLongItemClick in RecyclerView

查看:9
本文介绍了RecyclerView 中的 OnLongItemClick的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我开始在 Android 中使用 RecyclerView.一切正常,直到我为我的适配器实现触摸监听器.

I am starting to use RecyclerView in Android. Things work fine until I implement touch listener for my adapter.

来自本主题:

https://stackoverflow.com/a/26826692/2923403

我可以正确实现 childview 的侦听器.但是,我想同时实现 OnItemClick 和 OnItemLongClick,然后出现问题.他们总是同时被解雇.先是 OnItemClick,后是 OnItemLongClick,这使我的函数无用.

I can implement the listener for childview correctly. However, I would like to implement both OnItemClick and OnItemLongClick, then problem appear. They are always fired at the same time. OnItemClick first and OnItemLongClick later, which renders my function useless.

这是我的自定义侦听器代码(基于上面的代码,感谢 Fouad):

Here is my code for the custom listener (based on the code above, thanks to Fouad):

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;

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

    public void onItemLongClick(View view, int position);
}

GestureDetector mGestureDetector;

public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());

            if (childView != null && mListener != null) {
                mListener.onItemLongClick(childView, recyclerView.getChildPosition(childView));
            }
        }

    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {

    View childView = view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildPosition(childView));
        return true;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}

对于实现:

mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(),   mRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {
@Override
 public boolean onItemClick(View view, int position) {
//This is fired 1st
}
 @Override
 public void onItemLongClick(View view, int position) {
//This comes later
}));

你有什么解决办法吗?

推荐答案

您可以在自定义适配器实现中添加侦听器.它会是这样的:

You can add listeners in your custom adapter implementation. It will be something like:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    public interface OnItemClickListener {
        public void onItemClicked(int position);
    }

    public interface OnItemLongClickListener {
        public boolean onItemLongClicked(int position);
    }

    private Fragment mFragment;

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public View v;

        public ViewHolder(View v) {
            super(v);
            this.v = v;
        }
    }

    public RecyclerViewAdapter(Fragment fragment) {
        mFragment = fragment;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        holder.v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mFragment.onItemClicked(position);
            }
        });
        holder.v.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                mFragment.onItemLongClicked(position);
                return true;
            }
        });
    }
    . . .
}

注意开头的接口定义.通过这种方式,您将 onClick 和 onLongClick 事件传递给您的片段进行处理.很方便,你知道的

Note interfaces definition at the beginning. This way you're passing onClick and onLongClick events to your fragment for handling. Pretty much convenient, you know

这篇关于RecyclerView 中的 OnLongItemClick的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆