2014-11-16 50 views
2

我已經設置了一個具有TextViews的GridView,我想在觸摸時更改文本視圖的背景,然後在釋放後重置背景。網格視圖已經有OnItemClick和OnItemLongClick監聽器。通過爲GridView設置OnTouch偵聽器,我實現了觸摸文本視圖的後臺交換,然後獲取觸摸的位置並使用getChildAt獲取觸摸的文本視圖。這真的很好,直到我滾動網格視圖。由於文本視圖被重用,getChildAt返回了錯誤的文本視圖,所以我在這種情況下改變了錯誤文本視圖的背景。getChildAt在GridView中返回不正確的視圖

我該如何獲取正確的文本視圖,或者是否有方法爲每個文本視圖設置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! 
       ... 

回答

5

您可以使用getFirstVisiblePosition檢索的第一個孩子

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

這應該給你正確的位置偏移。當然,你應該檢查是否childPosition實際上是一個有效的位置(即不是<0>=gridView.getChildCount()

0

我建議你應該看看Android的列表選擇器。你甚至不需要這個任務的聽衆。列表選擇器,自定義觸摸反饋一塊蛋糕;)

有很多很好的答案和有關堆棧溢出列表選擇的問題,例如: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 
} 
相關問題