2017-02-19 12 views
0

Я создаю приложение Sudoku, но имею проблему. Я пытаюсь скрыть только определенные элементы в сетке, и я могу сделать это с помощью getView(), но в любое время я использую EditText, чтобы изменить значение и переместить клавиатуру вниз, getView() вызывается снова, и он стирает входные данные, поэтому я пытаюсь найти способ обойти его. Я считаю, что способ сделать это - просто пропустить элементы и скрыть некоторые элементы в onCreate(), хотя у меня возникают проблемы с получением каких-либо детей из представления. Я могу использовать getChildAt (i), хотя это возвращает только данные, а не само представление, поэтому я не могу изменить видимость. Я также пытался использовать getChildAt() из предыдущего ответа Stackoverflow, но, похоже, он не работает.Android loop через дочерние элементы GridView

Heres мой код:

MainActivity:

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


    } 

По существу, я хочу только хочу, чтобы скрыть некоторые элементы сетки для судоку, но я не» Думаю, я могу сделать это в getView(), потому что он будет сохранять значения сброса из-за t.setText ("") ;.

Любые предложения?

ответ

1

Ваш подход совершенно неправильный. Вы никогда не должны изменять представления в GridView, кроме как во время getView. Вы управляете GridView через свой адаптер и данные, которые он хранит. Например, скажем, у вас был адаптер, поддерживаемый списком строк, и вы хотели скрыть все остальные строки. Тогда у вас будет два варианта: измените список, чтобы удерживать только каждую другую строку, или измените данные, которые он удерживает, чтобы сохранить как строку, так и видимость, и почитать как в getView.

Вся точка GridView (или ListView или RecyclerView) заключается в том, что ее представление с поддержкой данных будет перерабатываться в соответствии с данными. Если вы начинаете пытаться самостоятельно манипулировать мнениями, это сильно ломается. Не делайте этого - манипулируйте данными, а затем скажите, чтобы представление обновлялось.

+0

Очень полезный комментарий, спасибо! Я бы просто удалил setText (""); и сделал каждую ячейку пустой с самого начала, которая исправила проблему. –