android - getChildAt 在 GridView 中返回错误的 View

标签 android gridview textview ontouchlistener

我已经设置了一个具有 TextView 的 GridView,我想在触摸时更改 TextView 的背景,然后在释放时重置背景。 GridView 已经具有 OnItemClick 和 OnItemLongClick 监听器。我通过为 GridView 设置 OnTouch 监听器来实现触摸 TextView 的背景交换,然后获取触摸的位置并使用 getChildAt 来获取触摸的 TextView 。这非常有效,直到我滚动 GridView 。由于 TextView 被重用,getChildAt 返回错误的 TextView ,因此我在这种情况下更改了错误 TextView 的背景。

如何才能始终获得正确的 TextView ,或者有没有办法为每个 TextView 设置 OnTouch 监听器,而不是在触摸 GridView 后尝试获取 TextView ?

    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!
                ...

最佳答案

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

int firstPosition = gridView.getFirstVisiblePosition();
int childPosition = position - firstPosition;
TextView txtView = (TextView)gridView.getChildAt(childPosition);

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

关于android - getChildAt 在 GridView 中返回错误的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26962965/

相关文章:

java - OnItemClickListener() 不适用于列表适配器

android - 启动监控失败,不运行程序。为什么?

java - 安卓中的布局

javascript - 使用自定义 "click"处理程序在网格单元格中呈现链接

java - 在制作新 Activity 时专注于文本的特定部分

Android textview 阴影不能使用 style.xml

android - 每当我尝试选择文本时,为什么我的 Android UI 表现不稳定?

android - 谷歌地图覆盖图像不可见

c# - 获取添加 onrowdatabound asp.net c# 的下拉列表的值

asp.net - 在Gridview中隐藏行时更新分页页面