适配器内的RecyclerView onItemClickListener和View.onClickListener

时间:2015-11-20 14:57:24

标签: java android xml

我正在开发一个简单的文件管理器。此文件管理器位于片段内,显然,它使用RecyclerView显示文件夹和文件。管理列表行的布局由以下内容组成:1 ImageView,1 TextView(显示文件夹/文件名)和一个ImageView选择选项(例如:重命名,删除等)。

要管理点击RecyclerView我实现了一个自定义的OnItemClickListener接口。代码是:

public class OnRecyclerItemClickListener implements RecyclerView.OnItemTouchListener {  

    GestureDetector gestureDetector;
    OnItemClickListener listener;

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

    public OnRecyclerItemClickListener(Context context, OnItemClickListener listener) {
       this.listener = listener;

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

    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
        if(childView != null && listener != null && gestureDetector.onTouchEvent(e)) {
            ((OnItemClickListener) listener).onItemClick(childView, view.getChildAdapterPosition(childView));
        }

        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
        // TODO Auto-generated method stub      
    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean arg0) {
        // TODO Auto-generated method stub      
    }
}

所以,在片段中:

recyclerView.addOnItemTouchListener(new OnRecyclerItemClickListener(activity, new OnRecyclerItemClickListener.OnItemClickListener() {
    @Override
    public void onItemClick(View view, int position) {
        // TODO Auto-generated method stub                  

        }
    }));

一切正常但现在我遇到了问题:当用户点击ImageView时管理选项无法正常工作,因为RecyclerView.OnItemClickListener在imageView.setOnClickListener上获胜。当用户单击ImageView时,PopupMenu显示但是总是消失,因为同时发生RecyclerView.OnItemClickListener和ImageView.OnClickListener。第一场胜利到第二场。我怎么解决这个问题?

2 个答案:

答案 0 :(得分:1)

您应该将您的点击功能更改为在ViewHolder内处理,然后您可以选择放置点击监听器的位置。这样做可以让您在布局中放置一个可点击的视图,其中可点击的ImageView位于其顶部。以下是这样做的简短示例。您需要填写空白,并正确设置Interface。如果您需要更多帮助,请告诉我。

public interface ViewHolderListener {
    void itemClicked(int position);
    void imageClicked(int position);
}

public void fillView(ViewHolderItem item) {
        clickableView.setOnClickListener(new View.OnClickListener {
                viewHolderListener.itemClicked(getAdapterPosition());
    });

        yourImage.setOnClickListener(new View.OnClickListener {
            viewHolderListener.imageClicked(getAdapterPosition());
    });
}

答案 1 :(得分:0)

首先,您需要了解整个视图将来自Recycler View(Imageview + textview)。现在如果你想为Recycler视图和ImageView都有两个单独的事件,那么理想的方法应该是你在Recyler视图的Adapter类中写下它们而不是创建一个接口。

在适配器类中,您编写了回收器视图本身的onclick侦听器。像:

view.setonClickListener(new View.OnClickListener(){ 的onClick){} }

对于ImageView,您可以编写类似

的内容

imageview.setonClickListener(new View.OnClickListener(){ 的onClick){ //此代码不会调用您的Recycler View的--View.onClick - } }

这是两者可以单独操作的唯一方式。