美文网首页程诺陪你学Android面试题高级UI
安卓ListView的item中含有EditText,动态添加i

安卓ListView的item中含有EditText,动态添加i

作者: 程思扬 | 来源:发表于2019-09-20 19:00 被阅读0次

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

    安卓ListView的item中含有EditText,动态添加item时EditText值的保存

    EditText是ListView的item,ListView的item可以动态添加,从而让用户动态输入一些内容。
    如下图的需求:

    image.png

    ListView是依靠Adapter将View和数据联系起来的,实现动态添加item的效果,比较简单,只需数据源再加一个条目,比如list.add(…),然后Adapter调用notifyDataSetChanged方法刷新View即可。

    到这里,我们的关注点来了,我们最终是需要获取ListView中所有EditText的值,保存到本地或者提交至服务器的,那么如何做到呢?我们知道,ListView的每个item都对应着一个实体类对象,显然,这个实体类有一个属性,用于保存EditText的值,在Adapter的getView()中,又用于EditText值的显示。所以我们需要实刻保存EditText的值到这个实体类对象的属性里,不然当我们调用notifyDataSetChanged刷新视图后会发现,EditText的值为空或者错乱。正如下图的效果:

    image.png

    要时刻保存EditText的值,我们需要给EditText设置一个文字改变时的监听器(addTextChangedListener),当文字发生改变后,我们获取EditText的值并存于itemObject的某个属性中。这里千万要脚下留心,在EditText调用setText之前,一定要把textChangedListener移除掉,否则setText后又会多次调用监听器里面的方法,造成值的清空。解决方法是每次getView时先remove掉监听器,再setText,最后再add监听器。适配器的代码如下:

    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也是同理实现的。这个Demo的运行效果如图:

    image.png

    相关文章

      网友评论

        本文标题:安卓ListView的item中含有EditText,动态添加i

        本文链接:https://www.haomeiwen.com/subject/wiwjuctx.html