【问题标题】:Why I can't seem to update my gridview from oncreate?为什么我似乎无法从 oncreate 更新我的 gridview?
【发布时间】:2014-10-20 14:33:44
【问题描述】:

我有以下 OnCreateMethod()

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_siege_main);
    mContext = getApplicationContext();

    gridview = (GridView) findViewById(R.id.gridview_board);
    initialBoard = new Board();
    initialBoard.generate(Globals.rand_width,
            Globals.rand_height, 
            Globals.rand_low, 
            Globals.rand_high);

    gridview.setAdapter(new BoardAdapter(this));

    gridview.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            //updateGameState(initialBoard);
        }
    });

    updateGameState(initialBoard);

    //typography
    TextView boardName = (TextView) findViewById(R.id.textview_board_name);
    boardName.setText("Uncharted Territory");
    Toast.makeText(SiegeMainActivity.this, "Uncharted Territory loaded", Toast.LENGTH_SHORT).show();

    Typeface face = Typeface.createFromAsset(getAssets(),
            "fonts/calibri-1.ttf");
    boardName.setTypeface(face);

    TextView pl1Name = (TextView) findViewById(R.id.textViewPlayer1Name);
    face = Typeface.createFromAsset(getAssets(),
            "fonts/calibri-1.ttf");
    pl1Name.setTypeface(face);

    TextView pl2Name = (TextView) findViewById(R.id.textViewPlayer2Name);
    face = Typeface.createFromAsset(getAssets(),
            "fonts/calibri-1.ttf");
    pl2Name.setTypeface(face);

}

而我的 updateGameState() 方法是这样的:

private void updateGameState(Board b) {
    int [] vals = b.getLinearVals();
    int [] plays = b.getLinearPlays();
    int [] score = b.getScore();
    int turns = b.getTurns();

    Button tile;
    //updating board
    for(int i=0;i<gridview.getChildCount();i++){
        tile = (Button)gridview.getChildAt(i);
        tile.setText(""+vals[i]);

        if(plays[i]==1)
            tile.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.btn_default_normal_green));
        else if (plays[i]==2)
            tile.setBackgroundDrawable(mContext.getResources().getDrawable(R.drawable.btn_default_normal_blue));
    }

    //Setting the score
    Button pl1Score, pl2Score;
    pl1Score = (Button) findViewById(R.id.buttonPlayer1Score);
    pl2Score = (Button) findViewById(R.id.buttonPlayer2Score);
    pl1Score.setText(""+score[0]);
    pl2Score.setText(""+score[1]);
}

当我在创建适配器后在 OnCreate 中调用 updateGameState() 时,它应该用一些值填充按钮。但这似乎不起作用。但是当我在点击时做同样的事情(在点击监听器中注释掉),它似乎工作正常。我想在加载页面时填充值。有人可以帮帮我吗?

【问题讨论】:

    标签: java android gridview


    【解决方案1】:

    您需要让GridView 知道数据已更改。如果您要动态更改ArrayAdapter 中的数据,则需要调用BoardAdapter.notifyDataSetChanged(),以便GridView 可以使用新数据“刷新”自身。

    在您的情况下,您需要创建一个对您的新 BoardAdapter 的引用,然后使用它来调用 notifyDataSetChange() 方法。

    private BoardAdapter boardAdapter = null;
    
    protected void onCreate(Bundle savedInstanceState) {
        // your things
        boardAdapter = new BoardAdapter(this);
        gridview.setAdapter(boardAdapter);
        // more things
    }
    
    private void updateGameState(Board b) {
        // update your data    
        boardAdapter.notifyDataSetChanged();
    }
    

    编辑:您在评论中提到您尝试使用ArrayAdapter,但它对您不起作用......也许可以尝试this,它说要使用GridViews invalidateViews() 方法。 gridView.invalidateViews()

    【讨论】:

    • 这不起作用。正如我所说,当我单击 gridview 时,它确实会更新。当我执行你的时,即使那样也不会发生
    • 嗯。检查编辑,看看是否有效。起初我没有注意到您正在直接在 GridView 中修改视图,而不是修改适配器将引用的视图列表(我认为这是正确的方法)。使用适合您的方法 =)
    【解决方案2】:

    在此处查看此 SO 问题和答案:

    How to refresh a GridView?

    我遇到了类似的问题,但即使单击按钮也无法刷新,即使项目正在更改和添加。就我而言,事实证明,诀窍是使用新/更新的项目列表重新创建(在您的情况下)BoardAdapter,然后将其重新分配给gridview。

    gridViewAdapter = new MyGridViewAdapter(this, blah, yourUpdatedItems);
    discoverGridView.InvalidateViews();
    discoverGridView.Adapter = gridViewAdapter;
    

    我确信必须有一种更好、更具反应性的方式来做这件事,但这至少让我的概念证明启动并运行。

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      相关资源
      最近更新 更多