2017-02-19 14 views
0

私は数独アプリを作成していますが、問題があります。グリッド上の特定の要素だけを隠そうとしていますが、getView()を使用することはできますが、 EditTextを使用して値を変更し、キーボードを下に移動すると、getView()が再び呼び出され、入力が消去されるため、その周囲の方法を見つけようとしています。私はこれを行う方法は、要素をループしてonCreate()の特定の要素を隠すことだと考えていますが、ビューの子を取得することに問題があります。私はgetChildAt(i)を使うことができますが、これはビュー自体ではなくデータのみを返しますので、可視性を変更することはできません。私はまた、以前のStackoverflowの答えからgetChildAt()ソリューションを使用してみましたが、それは動作していないようです。Androidループから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; } 


    } 

は基本的に、私は数独グリッドの特定の要素を非表示にするだけ旺旺が、私はドンt.setText( "");のために値をリセットし続けるので、私はgetView()でそれを行うことができると思います。

提案がありますか?

答えて

1

あなたのアプローチは完全に間違っています。 getView中以外では、GridViewのビューを決して変更しないでください。 GridViewは、そのアダプタとそれが保持するデータを使用して操作します。たとえば、文字列のリストでバッキングされたアダプタがあり、他のすべての文字列を非表示にしたいとします。 2つの選択肢があります。リストを変更して、他のすべての文字列だけを保持するか、文字列と可視性の両方を保持するために保持するデータを変更します。

GridView(またはListView、またはRecyclerView)の全体のポイントは、データと一致するようにリサイクルするデータバックアップビューです。自分でビューを操作しようとすると、それはひどく壊れます。そうしないで、データを操作して、ビューに更新を指示します。

+0

非常に有用なコメントです、ありがとう!私はsetText( "")を単に削除するだけで済みます。問題を解決した最初から各セルを空にしました。 –

関連する問題