2013-04-26 22 views
0

我有一個GridView設置,並且我已經實現了setOnItemClickListener接口的一個方法。首先,我已經做了一些Toast只是爲了反饋,然後我轉移到調用我的方法第一種方法,我把它放到一個while循環中,它會調用它,直到它返回true。第二種方法,當插入代碼時,阻止第一種方法工作,但我不。得到任何編譯器錯誤如何調用一個`setOnItemClickListener(...`

這是我onCreate含有我想setOnItemClickListener()我的第二個方法插入註釋

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    GridView gridview = (GridView) findViewById(R.id.gridview); 
    gridview.setAdapter(new ImageAdapter(this)); 

    final GameplayController gc = new GameplayController(this); 

    // Create board model, add units to player's list. 
    final UnitArray gameBoardModel = new UnitArray(); 

    gridview.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
       int position, long id) { 
      Toast.makeText(MainActivity.this, "" + position, 
        Toast.LENGTH_SHORT).show(); 
      boolean next = false; 
      while (next == false) { 
       next = gc.choosePiece(position, gameBoardModel, 
         (ImageView) v); 
      } 
      /*next = false; 
      while (next == false) { 
       next = gc.chooseEmpty(position, gameBoardModel, 
         (ImageView) v); 
      }*/ 
     } 
    }); 
} 

我說的第一種方法「有點兒」的作品,因爲它是將檢查在選擇的GridView的位置是「容許」的選擇和將更新ImageView那個選擇,然後return true的方法,否則它將return false的想法是,它會循環,直到用戶做出「有效」的選擇。現在,如果進行了有效的選擇,它確實會相應地更新ImageView,但是當進行「無效」選擇時,它會凍結。

所以它「有點」起作用,但是當我插入我的第二個方法時,即使進行了「有效」選擇,它也會凍結,並且它永遠不會變成第二種方法。

我想我有一些關於onItemClickListener()的信息。

--------------------------編輯-------------------附錄--------------

萬一它有助於看到的第一個方法我打電話,

public boolean choosePiece(int position, UnitArray ua, ImageView iv) { 
    if (ua.checkPiece(pNum, position) == true) { 
     if (ua.checkType(position, "rock")) { 
      ImageView v = iv; 
      v.setImageResource(R.drawable.rock1select); 
      return true; 
     } 
     if (ua.checkType(position, "paper")) { 
      iv.setImageResource(R.drawable.paper1select); 
      return true; 
     } 
     if (ua.checkType(position, "scissors")) { 
      iv.setImageResource(R.drawable.scissors1select); 
      return true; 
     } 
    } 
    /* 
    * With just the IF statements above catching the correct selections, my 
    * program crashes. I thought simply adding the RETURN FALSE; to catch 
    * everything else would work since it should just keep looping from the 
    * mAINaCTIVITY until it hits one of them and RETURNS TRUE;. So I will 
    * add this ELSE so that it will just redraw what is already there, 
    * maybe that will fix it? Like, maybe it really really wants to use the 
    * freaking listener for something. 
    * 
    * Nope, that didn't help at all. 
    */ 
    else { 
     System.out.println("Ohhhh, NO YOU DIDN'T!!!"); 
     if (ua.checkType(position, "rock")) { 
      System.out.println("Bad rock!, BAD!"); 
      ImageView v = iv; 
      v.setImageResource(R.drawable.rock2); 
      return false; 
     } 
     if (ua.checkType(position, "paper")) { 
      ImageView v = iv; 
      v.setImageResource(R.drawable.paper2); 
      return false; 
     } 
     if (ua.checkType(position, "scissors")) { 
      ImageView v = iv; 
      v.setImageResource(R.drawable.scissors2); 
      return false; 
     } 
     if (ua.checkType(position, "empty")) { 
      ImageView v = iv; 
      v.setImageResource(R.drawable.blank); 
      return false; 
     } 
    } 
    return false; 
} 

也許有在這裏,我要補充的東西告訴onItemClick..繼續前進並停止發送觸摸事件?

+0

它「凍結」,因爲它會陷入無限循環。在兩個while循環中,如果完成檢查但未找到有效位置,則沒有指定要執行的操作。 – Neoh 2013-04-26 08:27:19

+0

如何指定完成檢查時要執行的操作?我已經返回到下一個代碼,或返回false返回到另一輪。還有什麼我必須與'onItemClickListener'溝通讓它知道繼續前進? – ChrisWilson4 2013-04-26 08:47:22

回答

2

假設你知道的元素,你的GameplayController會去翻數量:

boolean found = false; 
int size = numberOfElements; 
for(int i=0; i<size;i++) { 
    if(gc.choosePiece(position, gameBoardModel,(ImageView) v)==true) { 
     found = true; 
     break; 
    } 
} 
if(found) { 
// do what u expect 
} 
+0

所以,也許使用確定的大小循環可能會有幫助,值得一試!我會盡力回報。 – ChrisWilson4 2013-04-26 09:12:35

+0

我在上面的示例代碼中進行了更正。 – Neoh 2013-04-26 09:15:53

+0

到目前爲止好,不會在無效選擇上崩潰。現在,我會嘗試第二種方法。 – ChrisWilson4 2013-04-26 09:19:54

0

你說當你用一個while循環向一個方法添加一些代碼時,該方法似乎永遠不會成功返回。你是否認爲第二個while循環執行的條件從不計算爲false? (在這種情況下,當值「true」被分配給變量「next」時)?

如果您不確定,也許您應該在每個循環內添加一個System.out.println(),以輸出執行哪個循環以及「下一個」的價值,它很有可能永遠保持虛假,否則不會做你的想法。

+0

大多數def,我完全是這樣做的,每當我按下一個無效的選擇它,聽起來很奇怪,但它永遠不會解開位置。所以在我的'println'裏它只是繼續前進。就像它從來沒有觸及它,所以我可以做出新的選擇,並繼續返回false。 – ChrisWilson4 2013-04-26 08:45:09

+0

它似乎「從不」未壓縮,因爲爲了解壓縮,首先調用onItemClickListener必須返回,以便可以運行更多的UI代碼。您的偵聽器方法陷入無限循環並永遠不會返回。在此之後,「不壓抑」的出現應該會發生。 – user1445967 2013-04-26 08:52:26

+0

不僅僅是外觀,它實際上一遍又一遍地重複出現在方法中,Sopln只是不斷返回到無限。必須有一些方法來喜歡'liftPress'或'onUnpress'什麼的。 – ChrisWilson4 2013-04-26 08:59:27

0

那麼我的代碼是在問這個問題的要點那麼可怕,但不能是看不見眼前的問題是,我在onClick中創建了boolean next,因此每次發生onClick時都會重置它。將創建的boolean next移至onClick之前可以解決問題。

有時候我會看到一個小問題太久,除了問題之外什麼都看不到,即使解決方案非常簡單。

相關問題