0

我想从另一个类(在我的例子中称为 GameplayController)更新我在 MainActivity 中创建的 GridView。

具体来说,我试图简单地将我目前在 MainActivity 中拥有的 gridView.setOnItemClickListener(....)... 插入到 GameplayController 类中的方法中。

我正在制作一个小棋盘游戏应用程序,我想创建一个方法“play()”,该方法为游戏循环运行,直到游戏结束。我在 MainActivity 的 onCreate 中启动了 GridView,然后我调用我希望游戏运行的方法,但我不知道如何将我创建的 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 吗?

4

2 回答 2

2

为了让它发挥作用,我必须,

答:在我的“GameplayController”类中创建一个 Context、一个 LayoutInflater 和一个构造函数。

Context ctxt;
LayoutInflater myInflater;

public GameplayController(Context c){
    ctxt = c;
    myInflater = (LayoutInflater)c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

B:更改我的“播放”方法以返回视图并接受视图作为参数。

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 扩展 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));

    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 android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.GridView;

以及我的“GameplayController”中的那些,它有点像 Image/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;
于 2013-04-25T11:18:31.393 回答
0

将活动(或网格,更确切地说)作为参数传递给您的play方法。

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

如果您的游戏是实时的,您需要将游戏循环放在另一个线程中并在处理程序上发布消息以更新视图(请参阅 Handler、Looper、AsyncTask ...)

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

于 2013-04-24T10:07:10.677 回答