如何获取网格布局中的行和列值?

问题描述 投票:0回答:3

我在Android Studio中定义了一个GridView,我想获取每个单元格的行和列值。基本上我正在构建一个 Tic Tac Toe 类型的应用程序,我想要每个单元格的值,以便我可以找到该单元格是空的还是已满的。

int chance = 0;
int[] pos = new int[9];
public void click(View view) {
    ImageView counter = (ImageView) view;
    if(chance == 0) {
           counter.setImageResource(R.drawable.yellow);
           chance = 1;
           // Here I want to update the that this particular cell is 
           clicked and it should be updated in pos array.
    }
    else {
           counter.setImageResource(R.drawable.red);
           chance = 0;
           // Similarly here also it should be updated.
    }
}
android grid-layout
3个回答
1
投票

您可以在布局 xml 文件中为网格布局中的每个组件使用标签,例如:

<ImageView
        android:id="@+id/imageView1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_margin="10dp"
        android:onClick="dropIn"
        android:tag="0" />

然后使用

.getTag()
函数获取组件

counter.getTag().toString()

0
投票

您可以使用

onItemClickListener
上的
GridView
并以
onItemClick
方法执行任务。

例如,将其添加到您的 Activity 类中:

yourGridViewObject.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView parent, View view, int position, long id) {

    if(chance==0)
    {
        counter.setImageResource(R.drawable.yellow);
           chance = 1;
         pos[position]=*updated value*;
    }
    else
    {
         counter.setImageResource(R.drawable.red);
           chance = 0;
           pos[position]=*updated value*;
    }
    your_adapter_object.notifyDataSetChanged();

  }
});

希望这有帮助。


0
投票

虽然使用

Ujjwal Anand
指出的标签很好,但这只是一种解决方法,并不是问题的真正答案。

我们可以在这里利用反射并执行以下操作:

  • span
    GridLayout.Spec
    类型类的成员
    GridLayout.Interval
  • min
    GridLayout.Interval
    类的成员,在我们的例子中,它保存着
    start
    的值(这是我们的行/列)
  • 我们首先使用反射从
    span
    /
    GridLayout.LayoutParams.rowSpec
    获取
    GridLayout.LayoutParams.columnSpec
  • 然后我们从
    min
    得到
    span
  • 的值

这是示例代码:

var rowSpec = ((GridLayout.LayoutParams)imageView.getLayoutParams()).rowSpec;
var spanField = rowSpec.getClass().getDeclaredField("span");
spanField.setAccessible(true);
var span = spanField.get(rowSpec);
var intervalClass = GridLayout.class.getDeclaredClasses()[2]; // For me the Interval class was at index 2
var startField = intervalClass.getDeclaredField("min");
var row = startField.getInt(span);
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.