安卓Android控件ListView获取item中EditText值
来源:互联网 发布:泰格软件安装 编辑:程序博客网 时间:2024/06/06 12:36
转载地址:
http://www.cnblogs.com/exmyth/p/3799260.html
安卓Android控件ListView获取item中EditText值
可以明确,现在没有直接方法可以获得ListView中每一行EditText的值.
解决方案:重写BaseAdapter,然后自行获取ListView中每行输入的EditText值.
大概算法:重写BaseAdapter.getView函数,用一个数组存储EditText中的值,根据position即数组下标,在getView中动态更新EditText和动态获取EditText中的值.因为ListView中的item是复用的,如果不动态清空或动态获取EditText中值,就会出现数据紊乱,或者没数据.那么在生成EditText的时候要监控其值的变化.存储下来.
代码:
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());
}
注意:
当我测试的时候删除EditText里面已有的数据时,发现在按回车键时,却又有数据了,原因在这里
@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变量中 } }
红色部分是在不为空的情况下显示的,当我删除掉这一部分时,就没有数据了。
在 寻找解决方法的时候,觉得这篇博客写的也不错:
http://blog.csdn.net/qq_28268507/article/details/53666576
最后附上自己写的demo,折腾了一个上午,终于折腾出来了,菜鸟一枚
http://download.csdn.net/detail/juhua2012/9767298
- 安卓Android控件ListView获取item中EditText值
- 安卓Android控件ListView获取item中EditText值
- 安卓Android控件ListView获取item中EditText值
- 安卓Android控件ListView获取item中EditText值
- 安卓Android控件ListView获取item中EditText值
- 安卓Android控件ListView获取item中EditText值
- Android控件ListView获取item中EditText值
- Android控件ListView获取item中EditText值
- Android控件ListView获取item中EditText值
- Android控件ListView获取item中EditText值
- Android控件ListView获取item中EditText值
- 安卓ListView的item中含有EditText,动态添加item时EditText值的保存
- Android ListView的Item中含有EditText,获取EditText里面的值并且刷新ListView值不改变
- Android ListView的Item中含有EditText,获取EditText里面的值并且刷新ListView值不改变
- Android ListView的Item中含有EditText,获取EditText里面的值并且刷新ListView值不改变
- Android ListView的Item中含有EditText,获取EditText里面的值并且刷新ListView值不改变
- 安卓Android控件ListView嵌套EditText控件
- 安卓ListView的Item中含有EditText,EditText里面的值保存,并且滑动ListView时EditText值不改变
- 互联网开发--web文件上传原理
- Python 中的哪些库让你相见恨晚
- 自定义View同时显示3个Fragment
- 在C/C++层面讲解析好的图片/视频绘制到Surface上面显示
- Vue.js UI框架
- 安卓Android控件ListView获取item中EditText值
- 防止表单重复提交,PHP生成token并自动更新
- thinkphp中实例化其他数据库方法集成
- Struts与Struts2的区别(简单详细)
- git提交到GitHub出错解决方案
- 荣耀v8华为钱包,为什么卡包里还是只有上海公交卡?--已解决
- hibernate 对象持续化
- 欢迎使用CSDN-markdown编辑器
- ORACLE in与exists语句的区别