2017-02-12 53 views
0

我有一個listview由TextView,EditText和Checkbox組成。我想讓edittext的狀態保持不變,當我在edittext中更改文本 ,然後向上或向下滾動列表視圖時,添加/寫入到edittext中的文本不應該更改,並且必須保留因爲它是如何使EditText值在可滾動列表視圖中持久

我設法使複選框持久化,我不知道如何使edittext狀態持久。

請看看在getView()methos它下面貼 並請讓我知道如何解決這個問題

getView

@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好的,在我的designList中有每個視圖「TextView,Checkbox,Edittext」的getter和setter,我在getView中使用這些getter和setter上面,我設法使複選框持久......但我的問題是,如何使Edittext值持久 – user2121

回答

1

您應該添加TextWatcher到您的編輯文本並使用它來跟蹤輸入到textview的文本。

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)解決它:

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

最終的解決方案後看起來就像這樣:

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

etExtendedEditText而不是EditText類型。

相關問題