getChildAt在GridView中返回错误的视图

时间:2014-11-16 22:46:24

标签: 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!
                ...

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

我建议你看一下Android的列表选择器。你甚至不需要听众来完成这项任务。列表选择器使定制触摸反馈变得轻而易举;)

Stack Overflow上有很多关于列表选择器的好答案和问题,例如:Custom selector for list background

但如果你真的要忽视我的建议......

然后我建议您检查MotionEvent是否为ACTION_DOWN或ACTION_UP类型,而不是处理每一点触摸输入。

示例代码:

int action = event.getActionMasked();

if(action == MotionEvent.ACTION_DOWN){
    //get child and change background to pressed state
} else if(action == MotionEvent.ACTION_UP){
    //get child and change background to normal state
}