Обновление элемента массива в кнопке onClickListener, которая находится в цикле - android - PullRequest
0 голосов
/ 02 февраля 2012

В основном я реализую приложение reversi для Android, и в настоящее время я пытаюсь обновить элемент в 2d массиве.Вызов находится в onClickListener, который находится в цикле, который использовался для настройки платы реверси.Проблема заключается в том, что после размещения части элемент isPositionEmpty должен измениться на false, однако это не так.Вот фрагмент кода:

for(int n = 0; n < 8; n ++){

        ...


    for(int i = 0; i < 8; i++ ){
        final ImageView button = new ImageView(this);

        final int countN = n;
        final int countI = i;

                    ...

button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {
                String buttonID = String.valueOf(button.getId());
                Log.d("buttonPressedID",buttonID);

                Log.d("isPositionEmpty", boardString);



                board[countI][countN].isPositionEmpty = false;

Помощь с благодарностью!заранее спасибо!

Ответы [ 2 ]

1 голос
/ 02 февраля 2012

Похоже, вы перепутали свои значения x и y? Board [countN] [countY] будет в том же порядке, в котором вы построили 2-й массив.

board[countN][countI].isPositionEmpty = false;

У вас есть только выдержка из вашего кода, но я бы сделал класс для отслеживания каждого квадрата, который расширяет ImageView / ImageButton. Тогда он позаботится о себе, и вам не нужно будет устанавливать его самостоятельно - логика будет в классе как побочный эффект действия фактического заполнения квадрата. Например, вы можете вызвать метод recordMove (int move), который является игроком первым или вторым игроком. Затем вся логика для изменения изображения и проверки, является ли оно пустым, обрабатывается в классе.

Тогда вам нужно будет только создать пользовательские кнопки / представления во вложенном цикле, и они позаботятся о себе. Передайте в одном слушателе - не нужно делать 64 анонимных слушателей.

Трудно все испортить, когда вы так организовываете.

0 голосов
/ 02 февраля 2012

Я не знаю, почему этот конкретный случай терпит неудачу. В целом, ваш код, кажется, смешивает данные и пользовательский интерфейс. Я хотел бы отделить данные (например, все данные, которые составляют вашу доску) от представлений. Напишите класс, в котором хранится только информация о штатах.

Чем в другом классе вы можете нарисовать все представления на основе данных в представлении. Что-то, что могло бы помочь вам начать, - это следующее сочетание псевдо-кода и кода. Это далеко не завершено, но настройка такой структуры предотвратит еще много проблем в будущем. УДАЧИ

class Square
{
    int buttonId;
    int rownum;
    int colnum;
    int state;    // can be empty || white || black
    //.. maybe more things you want to store   

    // some functions:
    void addPiece();
    void removePiece();
    void setButtonId(int id);

}

class Board
{
    // 2D array of Squares e.g. ArrayList<ArrayList<Square>>

    // some functions:
    void createEmptyBoard()    // which creates an empty board    
    ArrayList<ArrayList<Square> getAllSquares();
    ArrayList<Square> getAllWhiteSquare();
    ArrayList<Square> getAllBlackSquares();

}


/**
* You Activity should be able to draw the board, without any knowledge of the 
* underlying data. Vice Versa: your Board class, should know exactly where all
* pieces are, and what color they have, but should not care about what happens
* when they are clicked. Or, if they can be clicked.
*
* Your activity only has to make sure, that if views are clicked/dragged or moved
* that the Board class will be updated accordingly
*/
class YourActivity
{
    Board board;

    // some methods:
    drawBoard(Board board)
    {
        ArrayList<Square> white = board.getAllWhiteSquares();
        ArrayList<Square> black = board.getAllBlackSquares();

        for(Square w : white){
            Button b = new Button();    // create a button
            w.setButtonId(b.getId());   // store the button id in the square

            b.setOnClickListener(new OnClickListener()
            {
                public void onClick(View v)
                {
                    Square clickedSquare = board.getSquareWithId(v.getId());
                }
            );
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...