RecyclerView项目被点击时,其X和Y坐标为0

4
在一个 RecyclerView 中,我试图获取点击项目的 X 和 Y 位置。这是在我的适配器内部实现的:
@Override
    public void onBindViewHolder(AlfabetoViewHolder holder, final int position) {
       // setImage(holder.imageButton, images.get(position));

        holder.imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                view.getX(); // This is 0, but it shouldn't be!
                view.getY(); // This is also 0.
                executaSomAnimacaoLetra(sounds.get(position), Utils.getResourceFromFile(popups.get(position), context), view); // I do some stuff here
            }
        });


    }

事情是,无论X和Y,它们总是返回0,而它们不应该。我需要所点击项目的X和Y来执行一些动画。
我已经尝试在OnGlobalLayoutListener和OnPreDrawListener中获取X和Y位置(在Activity的onCreate中需要X和Y时两者都有效),但它们也返回0。
我正在使用GridLayoutManager在我的RecyclerView上:
recyclerView.setLayoutManager(new GridLayoutManager(Activity_alfabeto.this, 7, LinearLayoutManager.VERTICAL, false));

非常感谢您的帮助。


不确定,但是如何在rootview上添加一个小的线程,例如:view.post(new Runnable() { ... view.getX(); view.getY(); });,以便让UI开始显示,你试过了吗? - Blo
已经尝试过了,但没有成功。实际上我刚刚弄清楚了发生了什么,会发布答案的,但还是谢谢你的建议! - Felipe Ribeiro R. Magalhaes
2个回答

9

搞定了。我必须使用这种方法:

int[] originalPos = new int[2];
view.getLocationInWindow(originalPos);
//originalPos[0] is my X
//originalPos[1] is my Y

在这里,getX和getY是相对于视图的父级而不是它们在屏幕上的绝对位置。

    view.getLocationOnScreen(originalPos);

也可以使用。


2
只有当我不滚动回收视图时它才能正常工作。当我滚动时,它会给我错误的坐标。 - Andrii Kovalchuk
1
@tieorange 你可能需要考虑到RecyclerView已经滚动的数量。我现在无法查看,但值得一试! - Felipe Ribeiro R. Magalhaes

-1

以下方法对我有效:

view.getRawX()
view.getRawY()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接