从recyclerView.findChildViewUnder(e.getX(),e.​​getY())获取的视图上的getId()是-1

时间:2016-11-25 19:31:17

标签: java android android-recyclerview

我试图从使用recyclerView.findChildViewUnder(e.getX(), e.getY())获得的视图中获取view.getId(),但它总是返回-1

以下是相关代码:

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            View view = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (view !=null) {
                onClick(view);
            }
            return super.onSingleTapConfirmed(e);
        }

以下是我如何注册gesturelistener:

gestureDetector = new GestureDetectorCompat(getActivity(), new RecyclerViewGestureListener());

我尝试在onClick(View view)

中获取视图的ID

1 个答案:

答案 0 :(得分:0)

这里有一些关于问题解决方案的猜测...我希望我做对了。请告诉我我是怎么做的。

如果您想要在{x}布局中定义的事件位置id获取View,则很可能具有您实际想要的id的视图是返回视图的父视图,因此以下代码可能是您想要的:

private void onClick(View view) {

    // get a reference to the nearest ancestor View
    // that has an id.
    try {
        while (view.getId() == View.NO_ID) {
            view = (View) view.getParent();
        }
    } catch (NullPointerException e) {
        return;    // no ancestors with an ID found
    } catch (ClassCastException e) {
        return;    // cannot cast parent to View
    }

    // got the ID of a view
    view.getId();
}

如果您想要获得id ViewHolder View的{​​{1}}位置findContainingViewHolder()可能有用。以下代码可能会有所帮助...如果它仍然返回-1,请确保覆盖getItemId()的自定义实现中的ViewHolder

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    View view = recyclerView.findChildViewUnder(e.getX(), e.getY());
    if (view !=null) {
        RecyclerView.ViewHolder viewHolder = recyclerView.findContainingViewHolder(view);
        if (viewHolder != null) {
            onClick(viewHolder);
        }
    }
    return super.onSingleTapConfirmed(e);
}

private void onClick(RecyclerView.ViewHolder view) {

    // got the ID of the ViewHolder
    view.getItemId();
}