我已经设置了一个包含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!
...
答案 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
}