2017-02-12 25 views
0

У меня есть listview, состоящий из TextView, EditText и Checkbox. Я хочу, чтобы состояние edittext было постоянным, так что, когда я изменяю текст внутри edittext, а затем прокручиваю список вверх или вниз, текст, который был добавлен/записан в edittext, не должен изменяться и должен оставаться как этокак сделать значение EditText постоянным в прокручиваемом списке

Мне удалось установить флажок, я не знаю, как сделать состояние edittext постоянным.

, пожалуйста, посмотрите на GetView() Митос она размещена ниже и, пожалуйста, дайте мне знать, как решить эту проблему

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 вам нужно проверить и установить текст или установить ... –

+0

@SamirMangroliya ok, в моем списке дизайна есть получатели и сеттеры для каждого вида «TextView, Checkbox, Edittext», и я использую эти getters и сеттеры в getView как опубликованные выше, и мне удалось сделать флажок стойким ... но мой вопрос в том, как сделать значение Edittext постоянным – user2121

ответ

1

Вы должны добавить 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

, если я вас правильно понял, вы должны зарегистрироваться TextWatcher в вашем EditText и сохранить строковое значение каждый раз, когда вы меняете текст в нем. Так что вам нужно будет обновить вас часть кода из:

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

Где et будет типа ExtendedEditText вместо EditText.

 Смежные вопросы

  • Нет связанных вопросов^_^