【问题标题】:How to get each value from each EditText from a GridView or GridLayout?如何从 GridView 或 GridLayout 的每个 EditText 中获取每个值?
【发布时间】:2017-05-27 01:47:44
【问题描述】:

我仍然是 Android Studio 的新手,在我对其余部分进行编码之前,我还有一项任务要完成我的第一个与线性代数相关的项目。 任务是在 EditTexts 矩阵中获取 EditText 的每个值,并将它们存储到 int[][] 矩阵中。

现在我真的坚持了好几个小时,主要原因是我不知道如何使用 GridView 和 GridLayout。我也不知道哪个更好用。

下面是我正在尝试做的事情的表示:

假设用户想用 2x3 矩阵进行计算

然后应用程序将显示一个 2x3 的空 EditTexts 矩阵:

并且用户在空的 EditTexts 中输入了他们想要的任何数字

当他们点击“下一个矩阵”按钮时,我想从每个 EditText 中获取数字并将它们放入一个 int[][] 矩阵中,以便可以将其转移到另一个 Activity。

如果我能做到这一点,我将能够将每个 EditText 的值打印为 TextView。

再一次,为了放置 EditTexts 的矩阵,使用哪个 Grid 更好?网格视图还是网格布局?如何从中获取每个 EditTexts 的值?

【问题讨论】:

    标签: android xml android-studio matrix gridview


    【解决方案1】:

    我认为您在显示矩阵网格时遇到的问题已经解决。您现在可能需要获取 Matrix 内容。试试这个

    // SETUP YOUR GRIDVIEW
    GridView mGridView = (GridView)findViewById(R.id.grid);
    // COUNT TOTAL CHILDS IN IT
    int gridchilds = mGridView.getChildCount();
    // ITERATE THROUGH EACH CHILDS
    for(int i = 0; i < gridchilds; i++) 
    {
        // SELECT 'i' th CHILD IN A VIEWGROUP
        ViewGroup gridChild = (ViewGroup) mGridView.getChildAt(i);
        // GET THE CHILDREN SIZE OF THAT 'i' th CHILD
        int childSize = gridChild.getChildCount();
        // ITERATE THOUGH EACH
        for(int k = 0; k < childSize; k++) 
        {
            // CHECK IF IT IS AN 'EditText'
            if( gridChild.getChildAt(k) instanceof EditText)
            {
                // GET THE MATRIX VALUE AT THAT CELL
                String matrix_value=gridChild.getChildAt(k)).getText().toString();
            }
        }
    }
    

    希望对你有帮助

    【讨论】:

    • ViewGroup 中的第“i”个孩子是一行吗?换句话说,孩子是矩阵的行吗?
    • 没有。我们正在线性地获取每个孩子。 ViewGroup 中的第 i 个孩子从第一行开始,到最后一行结束,线性遍历
    • 好的,我在调试时遇到了一些问题。 String matrix_value=gridChild.getChildAt(k).getText().toString(); 产生错误,因此我将其更改为 EditText element = (EditText) gridChild.getChildAt(k); matrix_value = element.getText().toString();,但是当我调试它时,它无法识别 matrix_value 的值。此外,由于我们线性迭代每个子节点,我使用 3x3 矩阵运行调试器,我希望 childSize 为 3,但它保持为 1。
    【解决方案2】:

    您可以通过使用RecyclerViewGridLayoutManager 来实现。

    尝试以下方法 - 但是我不确定最后一个方法的逻辑(在 getValues() 中)是否正确。您可能需要在那里进行调整。

    (看起来你比我更熟悉数学,所以我把它留给你;))

    希望能成功

    RecyclerView rv = (RecyclerView) findViewById(your_recycler_view_id);
    rv.setLayoutManager(new GridLayoutManager(context, COLUMN_COUNT, GridLayoutManager.VERTICAL, false));
    rv.setAdapter(new YourCustomAdapter());
    
    class YourCustomAdapter() {
        EditText[][] editTexts = new EditText[COLUMN_COUNT][ROW_COUNT];
    
        public YourCustomAdapter() {
        }
    
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(your_edit_text_layout, parent, false);
            return new YourViewHolder(view, listener);
        }
    
        @Override
        public void onBindViewHolder(final RecyclerView.ViewHolder h, int position) {
            YourViewHolder holder = (YourViewHolder) h;
            editTexts[position / COLUMN_COUNT][position % COLUMN_COUNT] = holder.editText;
        }
    
        @Override
        public int getItemCount() {
            return COLUMN_COUNT * ROW_COUNT;
        }
    
        private class YourViewHolder extends RecyclerView.ViewHolder {
            EditText editText;
            private YourViewHolder() {
                super(itemView);
                this.editText = itemView.findViewById(your_edit_text_id);
            }
        }
    
        public int[][] getValues() {
            int [][] values = new int[ROW_COUNT][CULLOMN_COUNT];
    
            for(int i = 0; i < ROW_COUNT; i ++) {
                for(int j = 0; j < CULLOMN_COUNT; j ++) {
                    values[i][j] = 
                    Integer.parseInt(editTexts[i][j].getText().toString());
                }
            }
        }
    }
    

    【讨论】:

    • 我应该为context 放置什么rv.setLayoutManager(new GridLayoutManager(context, COLUMN_COUNT, GridLayoutManager.VERTICAL, false)); ? Also what should YourCustomAdapter()` 是为了使setAdapter() 方法工作的子类?
    • 首先,context 将是您的 Activity(扩展 Context)或 Fragment#getContext(),如果您使用的是片段。其次,(对不起,我忽略了超类),yourCustomAdapter 应该扩展RecyclerView.Adapter
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2015-07-19
    • 2022-01-04
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多