Search code examples
androidlistviewandroid-edittextbaseadaptergetview

how to make the EditText value persistent in a scrollable listview


I have a listview consists of TextView, EditText and Checkbox. I am want to make the state of the edittext to be persistent so that, when i change the text inside the edittext and then scroll the listview up or down that text that was added/written into the edittext should not be changed and must remain as it is

I managed to make the checkbox persistent, I do not know how to make the edittext state persistent.

please have a look at the getView() methos it is posted below and please let me know how to solve this issue

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

Solution

  • You should add a TextWatcher to your edit text and use that to track the text inputted to the 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())
            }