2012-12-10 85 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

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

相關問題