使用 OnItemClickListener 从 GridView 获取 2D 数组坐标



我有一个棋盘游戏类,它使用OnClickListener设置了一个9x9网格,如下所示:

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.Toast;
public class GameActivity extends Activity {
    private ImageAdapter boardAdapter;
    private int[][] board = new int[9][9];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
        for(int i = 0; i < 9; i++) {
            board[0][i] = 2;
            board[1][i] = 2;
            board[7][i] = 1;
            board[8][i] = 1;
        }
        GridView gameGridView = (GridView) findViewById(R.id.game_gridview);
        boardAdapter = new ImageAdapter(this, board);
        gameGridView.setAdapter(boardAdapter);
        AdapterView.OnItemClickListener boardListener = new AdapterView.OnItemClickListener() {
            int[][] startPosition;
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if(startPosition == null) {
                    startPosition = position; // Returns the value at the position, not the position itself, which is what I am looking for
                }
                boardAdapter.notifyDataSetChanged();
            }
        };
        gameGridView.setOnItemClickListener(boardListener);
    }
}

下面是我用来在 GridView 中显示我的 2d 整数数组的自定义 BaseAdapter 的代码:

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class ImageAdapter extends BaseAdapter {
    private Context context;
    int[][] board;
    int rowPosition, columnPosition, count;
    public ImageAdapter(Context c, int[][] content) {
        context = c;
        count = 0;
        board = new int[content.length][content[0].length];
        for (int i = 0; i < board.length; i++)
        {
            for (int j = 0; j < board[i].length; j++)
            {
                board[i][j] = content[i][j];
                count++;
            }
        }
        rowPosition = 0;
        columnPosition = 0;
    }
    public int getCount() {
        return count;
    }
    public int getRowCount() {
        return board.length;
    }
    public int getColumnCount() {
        return board[0].length;
    }
    public Object getItem(int rowNum, int columnNum) {
        return board[rowNum][columnNum];
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(context);
            imageView.setLayoutParams(new GridView.LayoutParams(120, 120));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setPadding(8, 8, 8, 8);
        }
        else {
            imageView = (ImageView) convertView;
        }
        columnPosition = position % board[0].length;
        rowPosition = (position - columnPosition) / board[0].length;
        switch(board[rowPosition][columnPosition]) {
            case 1:
                imageView.setImageResource(R.drawable.blackpiece);
                break;
            case 2:
                imageView.setImageResource(R.drawable.whitepiece);
                break;
            default:
                imageView.setImageResource(R.drawable.emptypiece);
                break;
        }
        return imageView;
    }
    public Object getItem(int position) {
        return null;
    }
    public long getItemId(int position) {
        return 0;
    }
}

我的问题是,当有人单击 GridView 时,我不确定如何获取 2d 数组中的坐标,例如,当用户单击 gridView 的第一个单元格时,它会返回值位置[0][0]。

根据您的问题,我了解到您要转换相应 2D 数组位置的位置。我更新了您的 OnItemClickListener 方法。通过 X 和 Y 位置,您从 2D 数组中获取各自的值。我假设网格是 9*9,因此没有列 =9。

声明类级变量

整数列计数=9;

    AdapterView.OnItemClickListener boardListener = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
                int xpos= position/columncount;
                int ypos=position%columncount;
            Log.v("position", "position x is :"+xpos+"  pos y is :"+ypos);
            boardAdapter.notifyDataSetChanged();
        }
    };

最新更新