Changing the background color of elements in a gridview when touched

I have a gridView layout that is filled with textView elements. I have an onTouch () implementation for gridView, where the cells that have been affected need to change the background color. Below is my code, but it does not work, and the virtual machine shuts down when I click.

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; } } 

Edit: Logcat trace

 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) 
+4
source share
2 answers

Actually, I figured it out!

I was looking for a TextView for the wrong return type here

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

I really needed a getChildAt method, not getItemAtPosition (which returns a string)

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

use gridView.setOnItemClickListener . You will also get a position in the onItemClick method and will not calculate it as it is now.

change i just realized that you want to change the color while the item is still pressed. in this case, I would suggest setting the background of the elements in the adapter for the selected selector

0
source

All Articles