【问题标题】:Weird RecyclerView behaviour onItemTouchListener奇怪的 RecyclerView 行为 onItemTouchListener
【发布时间】:2016-12-21 11:38:02
【问题描述】:

我正在尝试在我的 RecyclerView 上添加 RecyclerItemClickListener。它工作正常,事情是我的 RecyclerView 中的 2 个组件需要双击才能执行它们的 onClick 操作。

这是我的 MainActivity 中的 recyclerView.addOnItemTouchListener:

recyclerView.addOnItemTouchListener(
            new RecyclerItemClickListener(this, recyclerView ,new RecyclerItemClickListener.OnItemClickListener() {
                @Override public void onItemClick(View view, final int pos) {
                    TextView sourceName = (TextView) view.findViewById(R.id.sourceName);
                    ImageView moreSettings = (ImageView) view.findViewById(R.id.moreSettings);

                    // Add on click listeners
                    sourceName.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            initiateDialogAlert(passObjArrayList.get(pos).getName(), passObjArrayList.get(pos).getPassword());
                            boiteAlerte.show();
                        }
                    });

                    moreSettings.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            createPopupMenu(view, pos);
                        }
                    });                        
                }
            });

如何防止这种需要在组件上单击两次才能执行其操作的行为?

我的 RecyclerItemClickListener:

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

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

    public void onLongItemClick(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 child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child != null && mListener != null) {
                mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
            }
        }
    });
}

@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.getChildAdapterPosition(childView));
        return true;
    }
    return false;
}



public static boolean isViewClicked(View view, MotionEvent e) {
    Rect rect = new Rect();
    view.getGlobalVisibleRect(rect);
    return rect.contains((int) e.getRawX(), (int) e.getRawY());
}

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

@Override
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
}

【问题讨论】:

    标签: android android-recyclerview onitemclick


    【解决方案1】:

    查看 onTouch 和 onClick 之间的区别。对于 recyclerview,当您处理 onClick 时,您必须明智地编写代码。

    Recyclerview 默认不给我们 onClickListener 的功能。因此,您可以创建一个界面并执行它。

    请参考下面的例子来使用 onClickListener 进行 recyclerview。

    https://stand2code.blogspot.in/2016/12/recyclerview-item-onclicklistener.html

    当您的视图被单击时,您将返回 true。确定这是不是问题制造者?

    如果您想为不同的视图 onClicks 执行不同的操作。在那里尝试不同的界面。它将帮助您避免引起问题。

    示例代码:

    public class ContentAdapter extends RecyclerView.Adapter<ContentAdapter.ViewHolder> {
    
        public interface OnItemClickListener {
            void onItemClick(ContentItem item);
        }
    
        private final List<ContentItem> items;
        private final OnItemClickListener listener;
    
        public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
            this.items = items;
            this.listener = listener;
        }
    
        @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item, parent, false);
            return new ViewHolder(v);
        }
    
        @Override public void onBindViewHolder(ViewHolder holder, int position) {
            holder.bind(items.get(position), listener);
        }
    
        @Override public int getItemCount() {
            return items.size();
        }
    
        static class ViewHolder extends RecyclerView.ViewHolder {
    
            private TextView name;
            private ImageView image;
    
            public ViewHolder(View itemView) {
                super(itemView);
                name = (TextView) itemView.findViewById(R.id.name);
                image = (ImageView) itemView.findViewById(R.id.image);
            }
    
            public void bind(final ContentItem item, final OnItemClickListener listener) {
                name.setText(item.name);
                Picasso.with(itemView.getContext()).load(item.imageUrl).into(image);
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override public void onClick(View v) {
                        listener.onItemClick(item);
                    }
                });
            }
        }
    }
    

    【讨论】:

    • 在您链接的网站中,它显示“创建一个接口 OnItemClickListener”。我在哪里创建这个界面?
    • 在适配器类中。
    • 如果这听起来很愚蠢,请见谅。但是 FeedItem 是什么?
    • 它是一个对象。您可以在那里传递对象项目,以便获取被点击项目的数据。
    猜你喜欢
    • 1970-01-01
    • 2015-02-28
    • 2015-03-22
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多