Android通过GridView子元素循环

Android通过GridView子元素循环,android,gridview,sudoku,Android,Gridview,Sudoku,我正在创建一个数独应用程序,但有一个问题--我试图只隐藏网格上的某些元素,我可以使用getView()来隐藏,但每当我使用EditText更改值并向下移动键盘时,getView()会再次被调用,它会清除输入,因此我试图找到一种解决方法。我认为实现这一点的方法是简单地循环元素并在onCreate()中隐藏某些元素,尽管我在获取视图的任何子元素时遇到了问题。我可以使用getChildAt(I),尽管它只返回数据,而不是视图本身,因此我无法更改可见性。我也尝试过使用上一个Stackoverflow答案

我正在创建一个数独应用程序,但有一个问题--我试图只隐藏网格上的某些元素,我可以使用getView()来隐藏,但每当我使用EditText更改值并向下移动键盘时,getView()会再次被调用,它会清除输入,因此我试图找到一种解决方法。我认为实现这一点的方法是简单地循环元素并在onCreate()中隐藏某些元素,尽管我在获取视图的任何子元素时遇到了问题。我可以使用getChildAt(I),尽管它只返回数据,而不是视图本身,因此我无法更改可见性。我也尝试过使用上一个Stackoverflow答案中的getChildAt()解决方案,但似乎不起作用

这是我的密码:

主要活动:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.TextView;

import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;

public class MainActivity extends AppCompatActivity {

    public GridView gridView;
    public String[] items = new String[]{
            "5","3","4","6","7","8","9","1","2",
            "6","7","2","1","9","5","3","4","8",
            "1","9","8","3","4","2","5", "6","7",
            "8","5","9","7","6","1","4","2","3",
            "4","2","6","8","5","3","7","9","1",
            "7","1","3","9","2", "4","8","5","6",
            "9","6","1","5","3","7","2","8","4",
            "2","8","7","4","1","9","6","3","5",
            "3","4","5", "2","8","6","1","7","9"
    };

    public Boolean[] masker = new Boolean[]{
            TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE,
            TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE,
            FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE,
            TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE,
            TRUE, FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, TRUE,
            TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE,
            FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE,
            FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE,
            FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE,
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gridView = (GridView) this.findViewById(R.id.myGridView);
        CustomGridAdapter gridAdapter = new CustomGridAdapter(MainActivity.this, items, masker);
        gridView.setAdapter(gridAdapter);

        final int size = gridAdapter.getCount();
        for(int i = 0; i < size; i++) {
            ViewGroup gridChild = (ViewGroup) gridView.getChildAt(i);
            int childSize = gridChild.getChildCount();
            for(int k = 0; k < childSize; k++) {
                gridChild.getChildAt(k);
            }
        }

    }


}
导入android.support.v7.app.app活动;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.EditText;
导入android.widget.GridView;
导入android.widget.TextView;
导入静态java.lang.Boolean.FALSE;
导入静态java.lang.Boolean.TRUE;
公共类MainActivity扩展了AppCompatActivity{
公共网格视图;
公共字符串[]项=新字符串[]{
"5","3","4","6","7","8","9","1","2",
"6","7","2","1","9","5","3","4","8",
"1","9","8","3","4","2","5", "6","7",
"8","5","9","7","6","1","4","2","3",
"4","2","6","8","5","3","7","9","1",
"7","1","3","9","2", "4","8","5","6",
"9","6","1","5","3","7","2","8","4",
"2","8","7","4","1","9","6","3","5",
"3","4","5", "2","8","6","1","7","9"
};
公共布尔[]掩码=新布尔[]{
真,真,假,假,真,假,假,假,假,
真,假,假,真,真,真,假,假,假,
假,真,真,假,假,假,假,假,真,假,
真,假,假,假,真,假,假,假,假,真,
真,假,假,真,假,真,假,假,假,真,
真,假,假,假,真,假,假,假,假,真,
假,真,假,假,假,假,假,真,真,假,
假,假,假,真,真,真,假,假,真,
假,假,假,假,真,假,假,真,真,
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView=(gridView)this.findViewById(R.id.myGridView);
CustomGridAdapter gridAdapter=新的CustomGridAdapter(MainActivity.this、items、masker);
setAdapter(gridAdapter);
final int size=gridAdapter.getCount();
对于(int i=0;i
CustomGridAdapter:

    import android.content.Context;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.view.KeyEvent;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.inputmethod.EditorInfo;
    import android.view.inputmethod.InputMethodManager;
    import android.widget.BaseAdapter;
    import android.widget.EditText;
    import android.widget.TextView;

    import static java.lang.Boolean.FALSE;

    public class CustomGridAdapter extends BaseAdapter {


            private Context context;
            private String[] items;
            private Boolean[] masker;
            private String input;
            private EditText t;
            LayoutInflater inflater;

            public CustomGridAdapter(Context context, String[] items, Boolean[] masker ){
                this.context = context;
                this.items = items;
                this.masker = masker;

                inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            }

            public View getView(int position, View convertView, ViewGroup parent){
                if(convertView == null){
                    convertView = inflater.inflate(R.layout.cell, null);
                }

                t = (EditText) convertView.findViewById(R.id.editCell);

                if(masker[position]){
                    t.setText(items[position]);
                    t.setEnabled(FALSE);
                }else{
                    t.setText("");
                }

                if( (position % 9 != 0) && (position % 3 == 0) ){
                    t.setBackgroundResource(R.drawable.columnborder);
                }
                if( (position >= 18 && position <= 26) || (position >= 45 && position <= 53) ){
                    t.setBackgroundResource(R.drawable.rowborder);
                }
                if( (position == 21 || position == 24 || position == 48 || position == 51 ) ){
                    t.setBackgroundResource(R.drawable.cornerborder);
                }

                return convertView;
            }

            @Override
            public int getCount() { return items.length; }

            @Override
            public Object getItem(int position) { return items[position]; }

            @Override
            public long getItemId(int position) { return position; }


    }
导入android.content.Context;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.view.KeyEvent;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.view.inputmethod.EditorInfo;
导入android.view.inputmethod.InputMethodManager;
导入android.widget.BaseAdapter;
导入android.widget.EditText;
导入android.widget.TextView;
导入静态java.lang.Boolean.FALSE;
公共类CustomGridAdapter扩展了BaseAdapter{
私人语境;
私有字符串[]项;
私有布尔[]掩码;
私有字符串输入;
私人编辑;
充气机;
公共CustomGridAdapter(上下文上下文、字符串[]项、布尔[]掩码){
this.context=上下文;
这个项目=项目;
this.masker=masker;
充气器=(LayoutFlater)this.context.getSystemService(context.LAYOUT\u充气器\u服务);
}
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=充气机充气(R.layout.cell,空);
}
t=(EditText)convertView.findViewById(R.id.editCell);
if(遮罩[位置]){
t、 setText(项目[位置]);
t、 setEnabled(假);
}否则{
t、 setText(“”);
}
如果((位置%9!=0)和&(位置%3==0)){
t、 挫折背景资源(R.可绘制柱状边界);
}

如果((position>=18&&position=45&&position您的方法是完全错误的。除了在getView期间,您不应该更改GridView中的视图。您可以通过GridView的适配器及其所包含的数据来操作GridView。例如,假设您有一个适配器,它由一系列字符串支持,并且您希望隐藏其他所有字符串。您没有这样做然后,wo选项-将列表更改为仅保留每隔一个字符串,或将其保留的数据更改为同时保留字符串和可见性,并在getView中同时遵守这两个选项


GridView(或ListView或RecyclerView)的整个点这是一个数据备份视图,它将循环使用以匹配数据。如果您开始尝试自己操作视图,则会出现严重问题。不要这样做-操作数据,然后告诉视图更新自身。

非常有用的注释,谢谢!我可以简单地删除setText(“”);并从一开始就将每个单元格清空,从而解决了问题。