2013-04-26 51 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之前可以解决问题。

有时候我会看到一个小问题太久,除了问题之外什么都看不到,即使解决方案非常简单。