从GridView项中获取值

问题描述 投票:1回答:1

我正在开发一个项目,我有一个说5x5格式的TextViews,我想检查整行或列是否有相同的元素。我使用Adapter类只用一个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,以及我调用的方法。任何帮助,将不胜感激。

编辑:我正在寻找一种方法在适配器类中的getView方法之外执行此操作,而不是在onClick方法中。 (代码示例答案将受到高度赞赏)。此外,getChildAt方法调用返回null,因此我显示的代码不起作用,因为我正在为gridChild分配一个空值。

这是我用于TextViews的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");
        }
    }

这是我的适配器类:

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();
}

`

java android gridview textview parent-child
1个回答
0
投票

使用AdapterView时 - 例如你的GridView--你通常不希望直接访问和操纵它的View之外的孩子Adapters。相反,应更新支持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的孩子TextViews上的文字。然后,可以轻松地迭代该数组以执行行和列值检查。

由于数组将在Activity中修改,我们需要一种方法将TextView中点击的positionAdapter传递给Activity的click方法,因为我们需要它来访问正确的数组元素。为此,我们可以通过ViewsetTag()方法利用所有getTag()上的tag属性。例如,在GridAdaptergetView()方法中:

...
TextView textView = (TextView) gridView.findViewById(R.id.cell);
textView.setText(numbers[position]);
textView.setTag(position);
...

在click方法中,可以使用getTag()轻松检索位置,并将其用作从TextView数组中获取单击的numbers文本的索引。然后,您可以使用该文本进行必要的处理或计算,将修改后的值设置回数组元素,并在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中随时可用于在那里执行必要的检查。

© www.soinside.com 2019 - 2024. All rights reserved.