通过GridView子元素进行Android循环



我正在创建一个sudoku应用程序,但是遇到问题 - 我正在尝试隐藏网格上的某些元素,我可以使用getView()来做,但是任何时候使用EditText更改值并向下移动键盘,再次调用GetView()并擦除输入,因此我试图找到围绕它的方法。我相信这样做的方法是简单地循环浏览元素并将某些元素隐藏在ongreate()中,尽管我有问题吸引任何视野。我可以使用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);
            }
        }
    }

}

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

    }

本质上,我只想隐藏sudoku网格的某些元素,但是我认为我不能在getView()中执行此操作,因为它会因为t.setText(");。

有什么建议?

您的方法是完全错误的。除了在GetView期间,您绝对不要更改GridView中的视图。您可以通过其适配器及其保存的数据来操纵GridView。例如,可以说您的适配器由字符串列表支持,您想隐藏其他所有字符串。然后,您将有两种选择 - 更改列表以仅保存其他所有字符串,或更改其所拥有的数据以同时拥有一个字符串和可见性,并在GetView中尊敬。

GridView(或ListView或RecyClerview)的全部要点是,它的数据备份视图将回收以匹配数据。如果您开始尝试操纵自己的视图,那会严重打破。不要这样做 - 操纵数据,然后告诉视图自行更新。

最新更新