2017-02-12 16 views
0

リストビューはTextView、EditText、Checkboxで構成されています。私はedittextの状態を永続化して、テキストを変更するときにedittext内にある を編集してから、リストビューを上下にスクロールして、編集テキストに追加/書いたテキストを変更してはならず、残す必要がありますそのままですスクロール可能なリストビューでEditText値を永続化する方法

私はチェックボックスを永続化することができましたが、私はedittext状態を永続化する方法を知らないのです。

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 

    View view = null; 

    if (convertView == null) { 
     LayoutInflater layoutinflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     view = layoutinflater.inflate(R.layout.model, null); 

     final ViewHolder holder = new ViewHolder(); 

     holder.tv = (TextView) view.findViewById(R.id.tv); 
     holder.cb = (CheckBox) view.findViewById(R.id.cb); 
     holder.et = (EditText) view.findViewById(R.id.et); 

     holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       // TODO Auto-generated method stub 

       ItemDesign element = (ItemDesign) holder.cb.getTag(); 
       element.setChecked(buttonView.isChecked()); 
      } 
     }); 

     view.setTag(holder); 

     holder.cb.setTag(designList.get(position));//checkbox 

     //edittext 
     ItemDesign element = (ItemDesign) holder.et.getTag(); 
     if (element != null) { 
      element.setEtTxt(holder.et.getText().toString()); 
     } 
     holder.et.setTag(designList.get(position)); 

     holder.tv.setTag(designList.get(position));//textview 

    } else { 
     view = convertView; 

     ((ViewHolder)view.getTag()).et.setTag(designList.get(position));//edittext 
     ((ViewHolder)view.getTag()).tv.setTag(designList.get(position));//textview 
     ((ViewHolder)view.getTag()).cb.setTag(designList.get(position));//checkbox 
    } 
    ViewHolder holder = (ViewHolder) view.getTag(); 

    holder.tv.setText(designList.get(position).getTxt()); //textview 
    holder.cb.setChecked(designList.get(position).isChecked());//checkbox 

    //edittext 
    String etTxt = holder.et.getText().toString(); 
    designList.get(position).setEtTxt(etTxt); 
    holder.et.setText(designList.get(position).getEtTxt()); 

    return view; 
} 
private class ViewHolder { 
    TextView tv; 
    CheckBox cb; 
    EditText et; 
} 
+0

designList配列に値を保持する必要があります。 getViewメソッドでは、チェックとsettextまたはsetcheckedを行う必要があります。 –

+0

@SamirMangroliya ok、私のdesignListにはgettersとsetterが各ビュー "TextView、Checkbox、Edittext"用にあり、上記のチェックボックスを永続化することができましたが、私の質問は、Edittext値を永続化する方法です – user2121

答えて

1

それは 下に掲載されてgetViewメソッド()methosを見てください、私はこの問題に

を解決する方法を教えてくださいgetViewメソッドあなたにTextWatcherを追加する必要がありますテキストを編集し、それを使用してテキストビューに入力されたテキストを追跡する。

holder.et.setTag(designList.get(position));//edittext  
holder.et.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      ItemDesign element = (ItemDesign) holder.cb.getTag(); 
      element.setEditTextValue(s.toString()) 
     } 
1

私が正しく理解していれば、テキストを変更するたびにEditTextにTextWatcherを登録して文字列値を保存する必要があります。だから、からコードのあなたの部分を更新する必要があります。

String etTxt = holder.et.getText().toString(); 
designList.get(position).setEtTxt(etTxt); 
holder.et.setText(designList.get(position).getEtTxt()); 

(申し訳ありませんが、私はあなたがdesignListでなければならないの要素の何時に知っているが、それは聞かせていない、例えば、 Itemを入力することができます代わりにそれのあなたのタイプ)の過去:

final Item designItem = designList.get(position); 
holder.et.setText(designItem.getEtTxt()); 
holder.et.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

    @Override 
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

    @Override 
    public void afterTextChanged(Editable editable) { 
     designItem.setEtTxt(editable.toString); 
    } 
}); 

しかし、注意してください。新しい解決法ウォッチャーを登録しても、古いウォッチャーはクリアしないので、この解決策はまだ動作していません。EditTextにはclearTextChangedListeners()のようなものがないので、この状況では完璧な解決策はありません。しかし、あなたはあなた自身のEditText(copied from here)を導入し、それを解決することができます:etはタイプExtendedEditTextの代わりEditTextのものであろう

final Item designItem = designList.get(position); 
holder.et.clearTextChangedListeners(); 
holder.et.setText(designItem.getEtTxt()); 
holder.et.addTextChangedListener(new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

    @Override 
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 

    @Override 
    public void afterTextChanged(Editable editable) { 
     designItem.setEtTxt(editable.toString); 
    } 
}); 

public class ExtendedEditText extends EditText { 
    private ArrayList<TextWatcher> mListeners = null; 

    public ExtendedEditText(Context ctx) { 
     super(ctx); 
    } 

    public ExtendedEditText(Context ctx, AttributeSet attrs) { 
     super(ctx, attrs); 
    } 

    public ExtendedEditText(Context ctx, AttributeSet attrs, int defStyle) { 
     super(ctx, attrs, defStyle); 
    } 

    @Override 
    public void addTextChangedListener(TextWatcher watcher) { 
     if (mListeners == null) { 
      mListeners = new ArrayList<TextWatcher>(); 
     } 
     mListeners.add(watcher); 

     super.addTextChangedListener(watcher); 
    } 

    @Override 
    public void removeTextChangedListener(TextWatcher watcher) { 
     if (mListeners != null) { 
      int i = mListeners.indexOf(watcher); 
      if (i >= 0) { 
       mListeners.remove(i); 
      } 
     } 

     super.removeTextChangedListener(watcher); 
    } 

    public void clearTextChangedListeners() { 
     if (mListeners != null) { 
      for (TextWatcher watcher : mListeners) { 
       super.removeTextChangedListener(watcher); 
      } 

      mListeners.clear(); 
      mListeners = null; 
     } 
    } 
} 

その最終溶液の後は次のようになります。

関連する問題