OnLongItemClick在RecyclerView [英] OnLongItemClick in RecyclerView

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

问题描述

我开始在Android中使用RecyclerView。事情做工精细,直到我实现触摸监听我的适配器。

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

从这个主题

<一个href=\"http://stackoverflow.com/a/26826692/2923403\">http://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.

下面是我的code自定义监听器(基于上述code,感谢福阿德)

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

公共类RecyclerItemClickListener实现RecyclerView.OnItemTouchListener {
    私人OnItemClickListener mListener;

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
}));

你有任何解决方案?

Do you have any solution for that?

推荐答案

您可以在自定义适配器实现增加听众。这将是这样的:

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事件的片段处理。 pretty很多方便,你知道

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

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

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