2011-11-15 2 views
0

BaseAdapterのカスタム拡張を使用してGridViewによって入力された画面(図参照)があります。Android複数のListBoxのEditTextフィールド

ユーザーがのEditTextフィールドにテキストを入力すると、彼らは入力したテキストが周りのシフトまたは完全に消えるしやすいです。私はこれがビューのリサイクルと関係していると仮定していますが、リストアの理解は良くありません。

のフィールドが最初にマニフェストエントリアンドロイドのおかげで細かい動作しますwindowSoftInputMode =「adjustPanを」、しかし、あなたが無秩序にスクロールする場合、彼らは周りにシフトします。

私がやって探していますすべては、ユーザからのいくつかの文字列データを取得することです。文字列はグローバル文字列配列 "strings []"に格納されます。文字列配列は、TextWatcherの単なる拡張であるMyTextWatcherによって更新されます。

TextWatchersは常にグリッド内のそれらのEditTextフィールドの位置を知っていることを確認するためのコード(試み)。そうすれば、TextWatchersは常にstrings []を正しいインデックスで更新する必要があります。 「私はwouldn言って

public void initList() 
{ 
    ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.shape, strings) 
    { 
     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      final ViewHolder holder; 

      if (convertView == null || convertView.getTag() == null) { 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.shape, null); 

       holder = new ViewHolder(); 
       holder.text = (TextView) convertView.findViewById(R.id.shape_text); 
       holder.image = (ImageView) convertView.findViewById(R.id.shape_image); 
       holder.editText = (EditText) convertView.findViewById(R.id.shape_edittext); 

       holder.editText.addTextChangedListener(new TextWatcher() {      
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2){} 
        public void onTextChanged(CharSequence s, int start, int before, int count) { 
         if (gameType == SHAPES_ABSTRACT && before == 0 && count == 1) { 
          InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
          mgr.hideSoftInputFromWindow(holder.editText.getWindowToken(), 0);        
         }  
        } 
        public void afterTextChanged(Editable s) { 
         strings[holder.ref]= s.toString(); 
        } 
       }); 

       convertView.setTag(holder);      
      } 
      else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 
      holder.ref = position; 
      holder.editText.setText(strings[position]);        

      holder.image.setBackgroundResource(images[position]); 

      if (gameType == SHAPES_ABSTRACT) 
       holder.text.setText("Seq:"); 
      else 
       holder.text.setVisibility(View.GONE); 

      return convertView; 
     } 
    }; 

    grid.setAdapter(listAdapter); 
} 

答えて

2

は、私は再び他の回答のように、この序文になります。

shows an example of the carnage

私は問題が私のGetViewメソッド()から派生したと信じる十分な理由を持っていますこのように実装してください。あなたは恐ろしいものをやっている。参考文献をたくさん掲載しています。しかし、私はこれは役立つはずだと思う:

Map<EditText, MyTextWatcher> watchers = new HashMap<EditText, MyTextWatcher>(); 

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    View MyView = convertView; 
    if (MyView == null) 
    { 
     LayoutInflater li = getLayoutInflater(); 
     MyView = li.inflate(R.layout.shape, null); 
    } 

    EditText textbox = (EditText) MyView.findViewById(R.id.shape_edittext); 

    textbox.setText(strings[position]); 
    MyTextWatcher myTextWatcher = watchers.get(textbox); 

    if(myTextWatcher == null) 
    { 
     myTextWatcher = new MyTextWatcher(position, textbox); 
     watchers.put(textbox, myTextWatcher); 
    } 

    myTextWatcher.setIndex(position); 

    ImageView image = (ImageView) MyView.findViewById(R.id.shape_image); 
    image.setBackgroundResource(images[position]); 

    TextView text = (TextView) MyView.findViewById(R.id.shape_text); 
    text.setText("Seq:"); 

    return MyView; 
} 

ここでの問題は、あなたが、TextWatcherを作成したのEditTextにこれを追加しましたが、その後、位置リストでそれへの参照を保持するので、ということであるのEditTextとの間の参照TextWatcherが壊れていました。

このソリューションでは、値は、比較対象のインスタンスが比較行うとしませんのEditTextのために「等しい」ことを前提としています。そうでない場合は、すべてのEditTextインスタンスへの参照を保持し、 '=='をそれぞれ比較して一致を見つける必要があります。

私はこれを行うには、より安全な方法があると思いますが、それに打撃を与えます。

+0

私はあなたの以前の答えに基づいて別のアプローチを試みています。上記のコードは更新され、たぶんもっと賢明な地獄でしょう。私は激しくスクロールすると、edittextフィールドのテキストに問題が残っています。あなたはコード内に何も見えませんか? – Allen

+0

私の古いコードを見ると、問題があります。 'addTextChangedListener'は新しいリスナーを追加し続けるので、最終的には単一のEditTextに対して多くのリスナーを登録することになります。シンプルなバージョンが機能するかどうかを確認するには、ビューをリサイクルしないでください。新しいビューを常に膨らませる。それが動作し、パフォーマンス上の理由からリサイクルしたい場合は、そのTextWatcherをEditTextから更新または削除する方法を検討してください。 –

+0

これを行うには1つの方法です。画像はおそらく大きなメモリの問題になるでしょう。そのため、EditTextをxmlに入れる代わりに、EditTextを保持するFrameLayoutを作成し、コード内でそのFrameLayoutを取得し、すべての子を削除し、コードでEditTextを作成し、 TextWatcherを追加します。これは確実に "醜い"領域に入りますが、EditTextには "removeAllTextChangeListeners"がないようです。あなたはあなたがそれを与えたものへの参照を保持する必要があります。それ自体は醜いものであり、上のコードでMapのようなものが必要です。 –

関連する問題