как сделать значение EditText постоянным в прокручиваемом списке

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

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

пожалуйста, взгляните на метод 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;
}

person user2121    schedule 12.02.2017    source источник
comment
Вы должны поддерживать значение в массиве designList. и в методе getView вы должны проверить и settext или setchecked...   -  person Samir Mangroliya    schedule 12.02.2017
comment
@SamirMangroliya хорошо, в моем списке дизайна есть геттеры и сеттеры для каждого представления TextView, Checkbox, Edittext, и я использую эти геттеры и сеттеры в getView, как указано выше, и мне удалось сделать флажок постоянным ... но мой вопрос, как сделать значение Edittext постоянным   -  person user2121    schedule 12.02.2017


Ответы (2)


Вы должны добавить 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())
        }
person Saurabh    schedule 12.02.2017

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

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

to (извините, я не знаю, какое время элемента у вас в 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 (скопированный отсюда):

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.

person Michael Spitsin    schedule 12.02.2017