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);
}
私はあなたの以前の答えに基づいて別のアプローチを試みています。上記のコードは更新され、たぶんもっと賢明な地獄でしょう。私は激しくスクロールすると、edittextフィールドのテキストに問題が残っています。あなたはコード内に何も見えませんか? – Allen
私の古いコードを見ると、問題があります。 'addTextChangedListener'は新しいリスナーを追加し続けるので、最終的には単一のEditTextに対して多くのリスナーを登録することになります。シンプルなバージョンが機能するかどうかを確認するには、ビューをリサイクルしないでください。新しいビューを常に膨らませる。それが動作し、パフォーマンス上の理由からリサイクルしたい場合は、そのTextWatcherをEditTextから更新または削除する方法を検討してください。 –
これを行うには1つの方法です。画像はおそらく大きなメモリの問題になるでしょう。そのため、EditTextをxmlに入れる代わりに、EditTextを保持するFrameLayoutを作成し、コード内でそのFrameLayoutを取得し、すべての子を削除し、コードでEditTextを作成し、 TextWatcherを追加します。これは確実に "醜い"領域に入りますが、EditTextには "removeAllTextChangeListeners"がないようです。あなたはあなたがそれを与えたものへの参照を保持する必要があります。それ自体は醜いものであり、上のコードでMapのようなものが必要です。 –