2012-12-10 88 views
4

我有一个gridView布局,填充textView元素。我有一个gridView的onTouch()实现,其中触及的单元格需要更改背景颜色。下面是我的代码,但它不起作用,并且当我执行触摸操作时VM关闭。在gridview中更改背景颜色的项目触摸

gridView.setOnTouchListener(new OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent me) { 

      int action = me.getActionMasked(); 
      float currentXPosition = me.getX(); 
      float currentYPosition = me.getY(); 
      int position = gridView.pointToPosition((int) currentXPosition, (int) currentYPosition); 

      // Change the color of the key pressed 
      ((TextView) gridView.getItemAtPosition(position)).setBackgroundColor(Color.RED); 
      return true; 
    } 
} 

编辑:logcat的跟踪

12-10 15:34:28.081: E/InputEventReceiver(829): Exception dispatching input event. 
12-10 15:34:28.081: E/MessageQueue-JNI(829): Exception in MessageQueue callback: handleReceiveCallback 
12-10 15:34:28.221: E/MessageQueue-JNI(829): java.lang.ClassCastException: java.lang.String cannot be cast to android.widget.TextView 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at com.example.helloworld.GridViewActivity$1.onTouch(GridViewActivity.java:62) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.View.dispatchTouchEvent(View.java:7122) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2170) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1905) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.app.Activity.dispatchTouchEvent(Activity.java:2396) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.View.dispatchPointerEvent(View.java:7307) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3174) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3119) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4155) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4134) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4226) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.os.MessageQueue.nativePollOnce(Native Method) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.os.MessageQueue.next(MessageQueue.java:125) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.os.Looper.loop(Looper.java:124) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at android.app.ActivityThread.main(ActivityThread.java:4745) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at java.lang.reflect.Method.invokeNative(Native Method) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at java.lang.reflect.Method.invoke(Method.java:511) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-10 15:34:28.221: E/MessageQueue-JNI(829): at dalvik.system.NativeStart.main(Native Method) 
12-10 15:34:28.263: D/AndroidRuntime(829): Shutting down VM 
12-10 15:34:28.263: W/dalvikvm(829): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
12-10 15:34:28.362: E/AndroidRuntime(829): FATAL EXCEPTION: main 
12-10 15:34:28.362: E/AndroidRuntime(829): java.lang.ClassCastException: java.lang.String cannot be cast to android.widget.TextView 
12-10 15:34:28.362: E/AndroidRuntime(829): at com.example.helloworld.GridViewActivity$1.onTouch(GridViewActivity.java:62) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.View.dispatchTouchEvent(View.java:7122) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2170) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1905) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2176) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1877) 
12-10 15:34:28.362: E/AndroidRuntime(829): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1925) 
12-10 15:34:28.362: E/AndroidRuntime(829): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1379) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.app.Activity.dispatchTouchEvent(Activity.java:2396) 
12-10 15:34:28.362: E/AndroidRuntime(829): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1873) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.View.dispatchPointerEvent(View.java:7307) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3174) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3119) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4155) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4134) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4226) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:171) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.os.MessageQueue.nativePollOnce(Native Method) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.os.MessageQueue.next(MessageQueue.java:125) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.os.Looper.loop(Looper.java:124) 
12-10 15:34:28.362: E/AndroidRuntime(829): at android.app.ActivityThread.main(ActivityThread.java:4745) 
12-10 15:34:28.362: E/AndroidRuntime(829): at java.lang.reflect.Method.invokeNative(Native Method) 
12-10 15:34:28.362: E/AndroidRuntime(829): at java.lang.reflect.Method.invoke(Method.java:511) 
12-10 15:34:28.362: E/AndroidRuntime(829): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
12-10 15:34:28.362: E/AndroidRuntime(829): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-10 15:34:28.362: E/AndroidRuntime(829): at dalvik.system.NativeStart.main(Native Method) 
+0

你可以提供一个logcat的跟踪? –

回答

0

使用gridView.setOnItemClickListener代替。您还将获得onItemClick方法中的位置,并且不必像现在这样计算它。

编辑 我刚刚意识到你想在物品仍然按下时改变颜色。在这种情况下,我会建议将适配器中的项目背景设置为可绘制的选择器

+0

其实,颜色应该保持“选定”,直到我用不同的按钮取消选择。所以,选择器不起作用。另外,我想实际触摸拖动多个项目而不是点击一个项目。所以,如果我触摸拖动3个单元格,这3个单元格的颜色应该变成红色。 – PS376

+0

选择器将会非常适合你!按下或选择后,您将不得不将背景变为红色。并在onItemClick函数中设置当前项目为选中状态。 – Rotem

+0

其实,选择时改变颜色只是初始阶段。我需要执行更多不涉及颜色的操作。所以,我只需要一种访问TextView项目的方式。 – PS376

2

其实,我想出了它!

我是在错误的返回类型类型转换一个TextView这里

((TextView) gridView.getItemAtPosition(position)).setBackgroundColor(Color.RED); 

我真正需要的是方法getChildAt而不是getItemAtPosition(返回一个字符串)

String s = (String) gridView.getItemAtPosition(position); 
TextView tv = (TextView) gridView.getChildAt(position); 
tv.setBackgroundColor(Color.RED); 
+0

'getChildAt'的位置与项目位置不一样。你会得到错误和错误的意见。 – xmen

+0

谢谢。这对我有用! :) +1 – Gurfuffle

+0

救了我很多痛,感谢那:) –

相关问题