2013-04-24 57 views
0

我想更新一个GridView,我在另一个类中创建了我的MainActivity,在我的例子中叫做GameplayController。如何修改另一个类的MainActivity中的视图?

具体而言,我试图简单地插入gridView.setOnItemClickListener(....)...我目前我在MainActivity中的GameplayController类中的方法。

我正在制作一个小棋盘游戏应用程序,并且我想创建一个方法,“play(),并为游戏运行一个循环,直到游戏结束。我启动了GridView的onCreate MainActivity,然后我调用我希望游戏运行的方法,但我不知道如何让我创建的GridView到我的GameplayController类方法“play()”,以便我可以直接从那里直接更新它。

这里是我的MainActivity的相关部分:

... 
public class MainActivity extends Activity { 

    @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)); 

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

     //Run the game loop until winner found. 
     GameplayController.play(); 

     //This ClickListener I don't want here, I want it in my play() method. 
     gridview.setOnItemClickListener(new OnItemClickListener() { 
      public void onItemClick(AdapterView<?> parent, View v, int postion, 
        long id) { 
       // Toast for development help only. 
       Toast.makeText(MainActivity.this, "" + postion, 
         Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    } 
... 

这里是我想控制在GridView中的类的相关部分:

public class GameplayController { 

    private static boolean gameOver = false; 

    /* 
    * Will run the game loop. 
    */ 
    public static void play() { 
     while (gameOver == false) { 
      /* 
      * Update the GridView from Main somehow. 
      */ 


      /* 
      * Will be put in correct place later. 
      /* 
      gameOver = true; 
     } 
    } 
} 

这可能是完全错误的,但是我需要使用LayoutInflater吗?

+0

处理的触摸事件迪直接从相应的看法看起来更像是要走的路,而不是无限循环。 – Teovald 2013-04-24 10:01:49

回答

2

为了使它工作,我只好,

答:创建一个背景下,LayoutInflater和我的“GameplayController”类中的构造函数。 B:改变我的“play”方法返回View和接受View作为参数。

private static boolean gameOver = false; 

/* 
* Will run the game loop. 
*/ 
public View play(GridView gv) { 
    while (gameOver == false) { 
     gv.setOnItemClickListener(new OnItemClickListener(){ 
      public void onItemClick(AdapterView<?> parent, View v, int position, long id){ 
       Toast.makeText(ctxt, "" + position, Toast.LENGTH_SHORT).show(); 
       ImageView img = (ImageView)v; 
       img.setImageResource(R.drawable.rock1select); 
      } 
     }); 
     return(gv); 
    } 
    return gv; 
} 

}

C:创建在我的 “MainActivity” 一 “GameplayController” 对象,通过它的上下文作为参数。然后调用“play”方法,将它传递给Main中创建的View。

公共类MainActivity扩展活动{

@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)); 

    GameplayController gc = new GameplayController(this); 

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

    //Run the game loop until winner found. 
    gc.play(gridview); 

} 

仅供参考新手像我在这里是我的主要使用的import语句:

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.GridView; 

,并在我的“GameplayController”的那些,这是有点像个影像/ GridView控件位指示/适配器:

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.Toast; 
0

将活动(或网格)作为参数传递给play方法。

但是,你会发现你的play是一个无限循环,而且你永远不会到达gridview.setOnItemClickListener,并且B /你会以某种方式阻塞UI线程,比如你会在几秒钟内得到一个ANR 。

如果你的游戏是实时的,你需要把你的游戏循环在另一个线程和发布消息的处理程序,以更新的意见(见处理器,尺蠖,...的AsyncTask)

如果您的游戏基于回合,您只需在需要时调用视图更新例程,而无需循环。

+0

这个游戏会有一个方法来检查玩家在每次迭代中赢的时间,并将gameOver更改为true。我刚刚开始编码。 – ChrisWilson4 2013-04-24 10:14:19

+0

将视图作为参数传递,听起来很天才。我会尝试。 – ChrisWilson4 2013-04-24 10:16:32