可以在Android中遍历GridLayout内容的一行或一行吗?

时间:2019-07-12 05:00:03

标签: java android

我正在制作井字游戏,希望使逻辑重复性降低。我目前正在通过以下操作检查每个点击位置的所有可能的获胜条件:

public static boolean isCompleted(int position, ImageView[] blocks) {
    GameLogic.blocks = blocks;
    boolean isComplete = false;
    switch (position) {
        case 1:
            isComplete = areSameInSet(1, 2, 3) ||
                    areSameInSet(1, 4, 7) ||
                    areSameInSet(1, 5, 9);
            break;

然后将其发送到此方法,该方法将检查一个数字值,单击该值会设置为0,表示圆圈,为1表示交叉:

private static boolean areSameInSet(int first, int second, int third) {
    boolean value = blocks[first - 1].getId() == blocks[second - 1].getId() &&
            blocks[second - 1].getId() == blocks[third - 1].getId();

是否可以查看此gridview的整个行或列,而不是每次都需要3个不同参数的自定义方法?

我尝试查看TableView来查看这是否是一个更好的选择,但我也无法查看该路线中的任何方式。

理想情况下,我可以运行诸如checkSum(row,column)之类的方法,该方法求和以检查3或-3(一个玩家用1表示,一个玩家用-1表示),对角线有一些特殊条件。

编辑: 我不确定您的意思是什么,但是网格是静态的,内部的每个imageview都占据一个位置,并且不会移动。

  <GridLayout
        android:id="@+id/grid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:background="@color/colorPrimaryDark"
        android:columnCount="3"
        android:rowCount="3"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

紧接着是九个嵌套的ImageView,其中之一像这样:

 <ImageView
        android:id="@+id/block1"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_row="0"
        android:layout_column="0"
        android:background="@color/colorPrimary"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

2 个答案:

答案 0 :(得分:0)

如果列号是固定的,则可以在getView(position)中进行。您将获得职位。

您可以在链接中找到custom grid view的示例

CustomAdapter

public class CustomAdapter extends BaseAdapter{

    String [] result;
    Context context;
    int [] imageId;
    private static LayoutInflater inflater=null;
    public CustomAdapter(MainActivity mainActivity, String[] osNameList, int[] osImages) {
        // TODO Auto-generated constructor stub
        result=osNameList;
        context=mainActivity;
        imageId=osImages;
        inflater = ( LayoutInflater )context.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return result.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    public class Holder
    {
        TextView os_text;
        ImageView os_img;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        Holder holder=new Holder();
        View rowView;

        rowView = inflater.inflate(R.layout.sample_gridlayout, null);
        holder.os_text =(TextView) rowView.findViewById(R.id.os_texts);
        holder.os_img =(ImageView) rowView.findViewById(R.id.os_images);

        holder.os_text.setText(result[position]);
        holder.os_img.setImageResource(imageId[position]);

        rowView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(context, "You Clicked "+result[position], Toast.LENGTH_SHORT).show();
            }
        });

        return rowView;
    }

}

在您的活动中,

CustomAdapter adapter = new CustomAdapter(this, String[] your_data, int[] img_arr);
gridView.setAdapter(adapter);

如前所述,您的列为3,行数为3。 那么位置0, 1, 2表示第一行, 3, 4, 5表示第二行, 6, 7, 8表示第三行。

答案 1 :(得分:0)

因为网格是固定的,所以位置永远不会改变,因此基本上具有索引的项目:
0 1 2
3 4 5
6 7 8

您可以将数据映射到具有其索引的2D数组:
(0,0)(0,1)(0,2)
(1,0)(1,1)(1,2)
(2,0)(2,1)(2,2)

这样,您可以检查整个行和列。对于第一个对角线,您可以检查两个索引等于(0,0),(1,1),(2,2)的条件。对于第二个对角线,您可以检查索引总和为2(2,0),(1、1),(0、2)。