可以明确,现在没有直接方法可以获得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());
}

最新文章

  1. 【原】Github系列之二:开源 一行代码实现多形式多动画的推送小红点WZLBadge(iOS)
  2. poj3259 spfa
  3. Winform中DockPanel(引用WeifenLuo.WinFormsUI.Docking.dll组件)的使用
  4. 第 3 章 MySQL 存储引擎简介
  5. FTP操作类(支持异步)
  6. MyBatis的association示例——MyBatis学习笔记之三
  7. 此文件时入口文件index.php
  8. SqlServer 允许保存对数据库中表结构的修改
  9. JS 常用功能收集
  10. Spring mvc 下载文件处理
  11. mysql-day1
  12. ----Androd 系统开机显示白条提示 “there is internal problem with your device, Contact your manufacture ... ”
  13. Windows 远程桌面剪贴板失效的处理办法
  14. Day 5-7 exec 和元类的创建.
  15. python中对列表的所有操作方法
  16. Java知多少(50)Java throws子句
  17. xfsdump 备份文件系统
  18. Autofac和nopcommerce中的Autofac, 还有反射
  19. Ruby gem: Mac 系统下的安装与更新
  20. [BZOJ3609][Heoi2014]人人尽说江南好 结论题

热门文章

  1. Apache Wamp WampServer 配置多端口 多站点 虚拟目录
  2. Use powerful plugins in your vim.
  3. HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象
  4. bash 正则表达式匹配,一行文本中 “包含 ABC” 并且 “不包含 XYZ”
  5. C语言中的位拷贝与值拷贝浅谈(转载)
  6. 5个难以置信的VS 2015预览版新特性
  7. 【Markdown】Writing on Github - 在GitHub上写作
  8. (转)innodb 与 myisam 读写性能分析
  9. 【转】 C++中如何在一个构造函数中调用另一个构造函数
  10. Apache2.2+Tomcat7.0整合配置详解