更改2D图像数组OnClick

时间:2018-02-24 17:02:49

标签: java android imageview android-imageview

我是Android开发(和Java)的初学者。我在布局中有一些ImageView(2d图像数组)。我想要实现的是,每当我点击一个ImageView时,它应该根据一些逻辑设置一个图像,并显示当前图像(例如,每次点击时,下一个图像在数组中) 。我用Google搜索并设法做到这一点,但看起来很长。

public class GameActivity extends AppCompatActivity {
    private int [] inputTiles = {R.drawable.one, R.drawable.two, ...// more images};
    Random r = new Random();
    int matSize = 5;
    int[][] indexMat = new int[matSize][matSize];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        for (int i=0; i<matSize; i++) {
            for (int j=0; j<matSize; j++) {
                indexMat[i][j] = r.nextInt(10);
            }
        }

        final ImageView tile00 = findViewById(R.id.tile00);
        tile00.setImageResource(inputTiles[indexMat[0][0]]);
        tile00.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            indexMat[0][0] = (indexMat[0][0]+1)%5;
            tile00.setImageResource(inputTiles[indexMat[0][0]]);
            }
        });

        final ImageView tile01 = findViewById(R.id.tile01);
        tile01.setImageResource(inputTiles[indexMat[0][1]]);
        tile01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                indexMat[0][1] = (indexMat[0][1]+1)%5;
                tile01.setImageResource(inputTiles[indexMat[0][1]]);
            }
        });

        ...// a lot more ImageViews

    }
}

说我正在显示5x5网格图像。我有一个数组inputTiles和一个5x5数组indexMat中的可用图片,用于将当前图片的索引存储在ij的位置。然后,对于每个ImageView,我正在侦听单击并选择要从数组中显示的另一个图像。这是完美的,但在这个特定的例子中,我必须编写“clicklisten and action”块25次。如果有一种循环方式,那么我可以拥有任何n x n网格,这真的很棒。

我在谷歌搜索之后尝试循环,将ImageView保留在5x5数组中并循环遍历它,但循环变量似乎不在setOnClickListener()函数内部。它说我需要将ij设为final,但它会变成常量,所以不起作用。下面的代码就是我尝试过的,但它没有那种方式。

final ImageView[][] tiles = {{findViewById(R.id.tile00), findViewById(R.id.tile01), findViewById(R.id.tile02),...},
        {findViewById(R.id.tile10), ...,}};

for (int i=0; i<3;i++){
    for (int j=0; j<3; j++){
        tiles[i][j].setImageResource(inputTiles[indexMat[i][j]]);
        tiles[i][j].setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                indexMat[i][j] = //doesn't work
            }
        });
    }
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

执行此操作的最简单方法是使RecyclerView使用GridLayoutManager。这是关于如何在RecyclerView中实现所需功能的nice example

RecyclerView中设置这些图片后,您可以根据所点击的位置轻松管理onBindViewHolder功能中的点击监听器。