RecyclerView - onClick 中返回的不同视图

RecyclerView - Different view returned in onClick

我的代码使用 recyclerview 并在列表的每个项目(卡片视图)中的各个项目上实现 onClick。其中一项是共享按钮。在 onClick 侦听器中接收到的视图然后通过侦听器传递给片段。

@Override
public void onClick(View v) {
    if(mListener != null) {
        if(v instanceof ImageButton && v.getTag().equals("share")) {
            mListener.onItemClick(v, TYPE_SHARE, getAdapterPosition());
        }
    }
}

在fragment中的listener实现中,获取到传递的view的root view(card view)

@Override
public void onItemClick(View view, int type, int position) {
    if(type == TYPE_SHARE) {
        View r = view.getRootView()
        View u = r.findViewById(R.id.card_view);//this is the list item 
        File file = LayoutScreenshot.getScreenshot(u);
    }
}

然后通过 canvas 方法获取该视图的屏幕截图。

虽然所有这些都有效,但问题是 onClick 中返回的视图不一定是用户单击的视图。

这张图片是为了展示,我的观点稍微长一点,占据了屏幕的很大一部分。例如,如果用户单击项目 2 中的共享按钮,则返回的视图是项目 1、2 或 3 的视图,具体取决于用户滚动的方向以及当前可见的已单击视图的数量。

我将 "view" 传递给片段然后在那里处理它是不是错了?有人可以提供一些指示吗?

解决方法是在onClick 监听器中不依赖适配器传递的视图。而是使用 LayoutManager 方法。我这样做了

@Override
public void onItemClick(View view, int type, int position) {
    if(type == TYPE_SHARE) {
        View r = mLayoutManager.findViewByPosition(position);
        View u = r.findViewById(R.id.card_view);//this is the list item 
        File file = LayoutScreenshot.getScreenshot(u);
    }
}

所以,我用了

View r = mLayoutManager.findViewByPosition(position);

获取视图,现在视图与列表中单击的项目一致。