getChildAt在GridView中返回错误的视图

Jor*_*n H 2 android gridview textview ontouchlistener

我已经设置了一个具有TextViews的GridView,我想在触摸时更改文本视图的背景,然后在释放时重置背景.网格视图已经具有OnItemClick和OnItemLongClick侦听器.我已经通过为GridView设置OnTouch监听器为触摸的文本视图实现了背景交换,然后我获得了触摸的位置并用于getChildAt获取被触摸的文本视图.这非常有效,直到我滚动网格视图.因为文本视图被重用,getChildAt所以返回错误的文本视图,所以我在那种情况下改变了错误文本视图的背景.

如何始终获取正确的文本视图,或者是否有办法为每个文本视图设置OnTouch侦听器,而不是在触摸网格视图后尝试获取文本视图?

    gridView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            float currentXPosition = event.getX();
            float currentYPosition = event.getY();
            int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition);

            if (gridView.getChildAt(position) != null) {
                TextView txtView = (TextView)gridView.getChildAt(position);
                //might not be the right text view!
                ...
Run Code Online (Sandbox Code Playgroud)

小智 5

您可以使用它getFirstVisiblePosition来检索第一个孩子的偏移量

int firstPosition = gridView.getFirstVisiblePosition();
int childPosition = position - firstPosition;
TextView txtView = (TextView)gridView.getChildAt(childPosition);
Run Code Online (Sandbox Code Playgroud)

这应该给你正确的位置.当然,你应该检查一下是否childPosition真的是一个有效的位置(即不是<0>=gridView.getChildCount())