安卓ListView的item中含有EditText,動態(tài)添加item時EditText值的保存

原文鏈接:https://blog.csdn.net/zengd0/article/details/52236158

安卓ListView的item中含有EditText,動態(tài)添加item時EditText值的保存

EditText是ListView的item,ListView的item可以動態(tài)添加,從而讓用戶動態(tài)輸入一些內(nèi)容。
如下圖的需求:

image.png

ListView是依靠Adapter將View和數(shù)據(jù)聯(lián)系起來的,實現(xiàn)動態(tài)添加item的效果,比較簡單,只需數(shù)據(jù)源再加一個條目,比如list.add(…),然后Adapter調(diào)用notifyDataSetChanged方法刷新View即可。

到這里,我們的關(guān)注點來了,我們最終是需要獲取ListView中所有EditText的值,保存到本地或者提交至服務(wù)器的,那么如何做到呢?我們知道,ListView的每個item都對應(yīng)著一個實體類對象,顯然,這個實體類有一個屬性,用于保存EditText的值,在Adapter的getView()中,又用于EditText值的顯示。所以我們需要實刻保存EditText的值到這個實體類對象的屬性里,不然當(dāng)我們調(diào)用notifyDataSetChanged刷新視圖后會發(fā)現(xiàn),EditText的值為空或者錯亂。正如下圖的效果:

image.png

要時刻保存EditText的值,我們需要給EditText設(shè)置一個文字改變時的監(jiān)聽器(addTextChangedListener),當(dāng)文字發(fā)生改變后,我們獲取EditText的值并存于itemObject的某個屬性中。這里千萬要腳下留心,在EditText調(diào)用setText之前,一定要把textChangedListener移除掉,否則setText后又會多次調(diào)用監(jiān)聽器里面的方法,造成值的清空。解決方法是每次getView時先remove掉監(jiān)聽器,再setText,最后再add監(jiān)聽器。適配器的代碼如下:

import android.content.Context;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import java.util.List;

/**
 * Created by zengd on 2016/8/17 0017.
 */
public class ListViewAdapter extends BaseAdapter {

    private List<ItemBean> mData;
    private Context mContext;

    public ListViewAdapter(Context mContext, List<ItemBean> mData) {
        this.mContext = mContext;
        this.mData = mData;
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public Object getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_edittext, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final ItemBean itemObj = mData.get(position);

        if (holder.editText.getTag() instanceof TextWatcher) {
            holder.editText.removeTextChangedListener((TextWatcher) holder.editText.getTag());
        }

        holder.editText.setText(itemObj.getText());

        TextWatcher watcher = 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) {
                if (TextUtils.isEmpty(s)) {
                    itemObj.setText("");
                } else {
                    itemObj.setText(s.toString());
                }
            }
        };

        holder.editText.addTextChangedListener(watcher);
        holder.editText.setTag(watcher);

        return convertView;
    }

    private class ViewHolder {
        private EditText editText;

        public ViewHolder(View convertView) {
            editText = (EditText) convertView.findViewById(R.id.edit_text);
        }
    }
}

由于我的實際項目中item里有三個EditText,在這里我簡化成只有一個EditText。再多個EditText也是同理實現(xiàn)的。這個Demo的運行效果如圖:

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容