您的位置:首页 > 移动开发 > Android开发

Android控件ListView获取item中EditText值

2016-08-16 19:29 316 查看
可以明确,现在没有直接方法可以获得ListView中每一行EditText的值.

    解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值.
    大概算法:重写BaseAdapter.getView函数,用一个数组存储EditText中的值,根据position即数组下标,在getView中动态更新EditText和动态获取EditText中的值.因为ListView中的item是复用的,如果不动态清空或动态获取EditText中值,就会出现数据紊乱,或者没数据.那么在生成EditText的时候要监控其值的变化.存储下来.
    代码:

[java] view
plain copy

package com.exmyth.android;  

  

public class ListEditorAdapter extends BaseAdapter {  

    private LayoutInflater mInflater;  

    private List<Map<String, Object>> mData;// 存储的EditText值  

    public Map<String, String> editorValue = new HashMap<String, String>();//  

  

    public ListEditorAdapter(Context context, List<Map<String, Object>> data) {  

        mData = data;  

        mInflater = LayoutInflater.from(context);  

        init();  

    }  

  

    // 初始化  

    private void init() {  

        editorValue.clear();  

    }  

  

    @Override  

    public int getCount() {  

        return mData.size();  

    }  

  

    @Override  

    public Object getItem(int position) {  

        return null;  

    }  

  

    @Override  

    public long getItemId(int position) {  

        return 0;  

    }  

  

    private Integer index = -1;  

  

    @Override  

    public View getView(int position, View convertView, ViewGroup parent) {  

        ViewHolder holder = null;  

        // convertView为null的时候初始化convertView。  

        if (convertView == null) {  

            holder = new ViewHolder();  

            convertView = mInflater.inflate(R.layout.listview_item, null);  

            holder.name = (TextView) convertView  

                    .findViewById(R.id.list_item_name);  

            holder.title = (TextView) convertView  

                    .findViewById(R.id.list_item_title);  

            holder.value = (EditText) convertView  

                    .findViewById(R.id.list_item_inputvalue);  

            holder.value.setTag(position);  

            holder.userkey = (TextView) convertView.findViewById(R.id.user_key);  

            holder.value.setOnTouchListener(new OnTouchListener() {  

                @Override  

                public boolean onTouch(View v, MotionEvent event) {  

                    if (event.getAction() == MotionEvent.ACTION_UP) {  

                        index = (Integer) v.getTag();  

                    }  

                    return false;  

                }  

            });  

            class MyTextWatcher implements TextWatcher {  

                public MyTextWatcher(ViewHolder holder) {  

                    mHolder = holder;  

                }  

  

                private ViewHolder mHolder;  

  

                @Override  

                public void onTextChanged(CharSequence s, int start,  

                        int before, int count) {  

                }  

  

                @Override  

                public void beforeTextChanged(CharSequence s, int start,  

                        int count, int after) {  

                }  

  

                @Override  

                public void afterTextChanged(Editable s) {  

                    if (s != null && !"".equals(s.toString())) {  

                        int position = (Integer) mHolder.value.getTag();  

                        mData.get(position).put("list_item_inputvalue",  

                                s.toString());// 当EditText数据发生改变的时候存到data变量中  

                    }  

                }  

            }  

            holder.value.addTextChangedListener(new MyTextWatcher(holder));  

            convertView.setTag(holder);  

        } else {  

            holder = (ViewHolder) convertView.getTag();  

            holder.value.setTag(position);  

        }  

        Object value = mData.get(position).get("list_item_name");  

        if (value != null) {  

            holder.name.setText((String) value);  

        }  

        value = mData.get(position).get("list_item_title");  

        if (value != null) {  

            holder.title.setText(value.toString());  

        }  

        value = mData.get(position).get("user_key");  

        if (value != null) {  

            holder.userkey.setText(value.toString());  

        } else {  

            holder.userkey.setText("-1");  

        }  

        value = mData.get(position).get("list_item_inputvalue");  

        if (value != null && !"".equals(value)) {  

            holder.value.setText(value.toString());  

        } else {  

            String key = mData.get(position).get("user_key").toString();  

            String inputValue = editorValue.get(key);  

            holder.value.setText(inputValue);  

        }  

        holder.value.clearFocus();  

        if (index != -1 && index == position) {  

            holder.value.requestFocus();  

        }  

        return convertView;  

    }  

  

    public final class ViewHolder {  

        public TextView name;  

        public TextView title;  

        public EditText value;// ListView中的输入  

        public TextView userkey;// 用来定义的标志性主键,可不用关心  

    }  

}  

使用方法:
private List<Map<String, Object>> mCheckItemList = new ArrayList<Map<String, Object>>();
mAdapter = new ListEditorAdapter(this, mCheckItemList);
m_lvListView.setAdapter(mAdapter);
直接改变mCheckItemList中的数据,然后调用mAdapter.notifyDataSetChanged();就可以更新ListView的数据
当然,直接从mCheckItemList也可以获得用户在EditText中输入的数据.比较方便
 
 
 
其他:
ListView list= (ListView)findViewById(R.id.list);//获得listview

for (int i = 0; i < list.getChildCount(); i++) {

     LinearLayout layout = (LinearLayout)list.getChildAt(i);// 获得子item的layout

     EditText et = (EditText) layout.findViewById(R.id.et);// 从layout中获得控件,根据其id

// EditText et = (EditText) layout.getChildAt(1)//或者根据位置,在这我假设TextView在前,EditText在后

     

     System.out.println("the text of "+i+"'s EditText:----------->"+et.getText());

}
转载博客原文:http://blog.csdn.net/zz_mm/article/details/38235501
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: