从 GridView 项中获取值
Get the values from GridView items
我正在做一个项目,假设我有一个 5x5 的 TextView 网格,我想检查整行或整列是否具有相同的元素。我正在使用一个适配器 class 只用一个 textview 元素来扩展我的 gridview。这是我试过但似乎无法正常工作的代码:
final int size = gridView.getCount(); //25
int temp = 0;
for (int i = 0; i < size; i++) {
ViewGroup gridChild = (ViewGroup) gridView.getChildAt(i);
childSize = gridChild.getChildCount();
for (int j = 0; j < childSize; j++) {
if (gridChild.getChildAt(j) instanceof TextView &&
((TextView) gridChild.getChildAt(j)).getText().toString().equals("x")) {
temp++;
}
问题是当我尝试调试时,调试器显示 childSize 变量的空值并且无法从 getChildAt 正确获取值。基本上,我要做的是进入 if 语句。这也是我第一次使用 ViewGroup calss,以及我调用的方法。任何帮助将不胜感激。
编辑:我正在寻找一种在适配器 class 的 getView 方法之外而不是在 onClick 方法中执行此操作的方法。 (代码示例答案将不胜感激)。此外,getChildAt 方法调用 returns null 因此我显示的代码将不起作用,因为我正在为 gridChild 分配一个空值。
这是我用于 TextView 的 onClick:
`
public void numberFill(View view) {
if (((TextView) view).getText().toString().isEmpty()) {
((TextView) view).setText(String.valueOf(numbCounter + 1));
numbCounter++;
}
else if (!((TextView) view).getText().toString().isEmpty() && numbCounter >= 16) {
((TextView) view).setText("x");
}
}
这是我的适配器class:
public class GridAdapter extends BaseAdapter {
private final Context mContext;
private String[] numbers;
public GridAdapter(Context context, String[] numbers) {
this.mContext = context;
this.numbers = numbers;
}
@Override
public int getCount() {
return numbers.length;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return numbers[position];
//return null;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
if (convertView == null) {
gridView = new View(mContext);
gridView = inflater.inflate(R.layout.textview_layout, null);
TextView textView = (TextView) gridView.findViewById(R.id.cell);
textView.setText(numbers[position]);
} else {
gridView = (View) convertView;
}
return gridView;
}
}
numberFill 已修改:
public void numberFill(View view) {
int index = (Integer) view.getTag();
if (numbers[index].toString().isEmpty()) {
numbers[index] = String.valueOf(numbCounter + 1);
numbCounter++;
}
else if (!numbers[index].toString().isEmpty() && numbCounter >= 25) {
numbers[index] = "x";
}
gridAdapter.notifyDataSetChanged();
}
`
使用 AdapterView
时——例如您的 GridView
– 您通常不想直接访问和操作其 Adapter
之外的子 View
.相反,应该更新支持 Adapter
的数据集,然后刷新 GridView
。
在您的情况下,您可能在 Activity
:
中有与此类似的设置
private GridAdapter gridAdapter;
private String[] numbers;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
numbers = new String[25];
gridAdapter = new GridAdapter(this, numbers);
}
在这里,numbers
数组是您要直接修改的内容,而不是 GridView
的子 TextView
上的文本。然后可以轻松地迭代该数组以进行行和列值检查。
由于数组会在Activity
中修改,我们需要一种方法将Adapter
中点击的TextView
的position
传递给Activity
的 click 方法,因为我们需要它来访问正确的数组元素。为此,我们可以通过 setTag()
和 getTag()
方法利用所有 View
上可用的标签 属性。例如,在 GridAdapter
的 getView()
方法中:
...
TextView textView = (TextView) gridView.findViewById(R.id.cell);
textView.setText(numbers[position]);
textView.setTag(position);
...
在点击方法中,位置可以很容易地用getTag()
检索,并作为索引从numbers
数组中得到被点击的TextView
的文本。然后您可以对该文本进行必要的处理或计算,将修改后的值设置回数组元素,并在 Adapter
.
上触发刷新
public void numberFill(View view) {
int index = (Integer) view.getTag();
// Do your processing with numbers[index]
numbers[index] = "new value";
gridAdapter.notifyDataSetChanged();
}
notifyDataSetChanged()
调用将导致 GridView
更新其子项,您的新值将设置在适当的 TextView
中。 numbers
数组现在也有当前值,并且在 Activity
中随时可用以在那里执行必要的检查。
我正在做一个项目,假设我有一个 5x5 的 TextView 网格,我想检查整行或整列是否具有相同的元素。我正在使用一个适配器 class 只用一个 textview 元素来扩展我的 gridview。这是我试过但似乎无法正常工作的代码:
final int size = gridView.getCount(); //25
int temp = 0;
for (int i = 0; i < size; i++) {
ViewGroup gridChild = (ViewGroup) gridView.getChildAt(i);
childSize = gridChild.getChildCount();
for (int j = 0; j < childSize; j++) {
if (gridChild.getChildAt(j) instanceof TextView &&
((TextView) gridChild.getChildAt(j)).getText().toString().equals("x")) {
temp++;
}
问题是当我尝试调试时,调试器显示 childSize 变量的空值并且无法从 getChildAt 正确获取值。基本上,我要做的是进入 if 语句。这也是我第一次使用 ViewGroup calss,以及我调用的方法。任何帮助将不胜感激。
编辑:我正在寻找一种在适配器 class 的 getView 方法之外而不是在 onClick 方法中执行此操作的方法。 (代码示例答案将不胜感激)。此外,getChildAt 方法调用 returns null 因此我显示的代码将不起作用,因为我正在为 gridChild 分配一个空值。
这是我用于 TextView 的 onClick:
`
public void numberFill(View view) {
if (((TextView) view).getText().toString().isEmpty()) {
((TextView) view).setText(String.valueOf(numbCounter + 1));
numbCounter++;
}
else if (!((TextView) view).getText().toString().isEmpty() && numbCounter >= 16) {
((TextView) view).setText("x");
}
}
这是我的适配器class:
public class GridAdapter extends BaseAdapter {
private final Context mContext;
private String[] numbers;
public GridAdapter(Context context, String[] numbers) {
this.mContext = context;
this.numbers = numbers;
}
@Override
public int getCount() {
return numbers.length;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public Object getItem(int position) {
return numbers[position];
//return null;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater)
mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View gridView;
if (convertView == null) {
gridView = new View(mContext);
gridView = inflater.inflate(R.layout.textview_layout, null);
TextView textView = (TextView) gridView.findViewById(R.id.cell);
textView.setText(numbers[position]);
} else {
gridView = (View) convertView;
}
return gridView;
}
}
numberFill 已修改:
public void numberFill(View view) {
int index = (Integer) view.getTag();
if (numbers[index].toString().isEmpty()) {
numbers[index] = String.valueOf(numbCounter + 1);
numbCounter++;
}
else if (!numbers[index].toString().isEmpty() && numbCounter >= 25) {
numbers[index] = "x";
}
gridAdapter.notifyDataSetChanged();
}
`
使用 AdapterView
时——例如您的 GridView
– 您通常不想直接访问和操作其 Adapter
之外的子 View
.相反,应该更新支持 Adapter
的数据集,然后刷新 GridView
。
在您的情况下,您可能在 Activity
:
private GridAdapter gridAdapter;
private String[] numbers;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
numbers = new String[25];
gridAdapter = new GridAdapter(this, numbers);
}
在这里,numbers
数组是您要直接修改的内容,而不是 GridView
的子 TextView
上的文本。然后可以轻松地迭代该数组以进行行和列值检查。
由于数组会在Activity
中修改,我们需要一种方法将Adapter
中点击的TextView
的position
传递给Activity
的 click 方法,因为我们需要它来访问正确的数组元素。为此,我们可以通过 setTag()
和 getTag()
方法利用所有 View
上可用的标签 属性。例如,在 GridAdapter
的 getView()
方法中:
...
TextView textView = (TextView) gridView.findViewById(R.id.cell);
textView.setText(numbers[position]);
textView.setTag(position);
...
在点击方法中,位置可以很容易地用getTag()
检索,并作为索引从numbers
数组中得到被点击的TextView
的文本。然后您可以对该文本进行必要的处理或计算,将修改后的值设置回数组元素,并在 Adapter
.
public void numberFill(View view) {
int index = (Integer) view.getTag();
// Do your processing with numbers[index]
numbers[index] = "new value";
gridAdapter.notifyDataSetChanged();
}
notifyDataSetChanged()
调用将导致 GridView
更新其子项,您的新值将设置在适当的 TextView
中。 numbers
数组现在也有当前值,并且在 Activity
中随时可用以在那里执行必要的检查。